博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UDP,TCP的套接字编程的Python实现
阅读量:5787 次
发布时间:2019-06-18

本文共 2843 字,大约阅读时间需要 9 分钟。

UDP,TCP的套接字编程的Python实现

套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型,并设置一些普通参数,例如缓存大小等,除此之外的所有都要运输层自己完成。

需求:

为了学习套接字如何操作运输层的UDP和TCP协议,此处提出一个需求:客户端接收用户输入的信息,并发送到服务器上,并接收由服务器把所有字母大写之后的数据,再显示出来。

整个过程需要以下步骤:
1.客户端提示用户信息输入并将数据发送给服务器
2.服务器接收信息,把字幕转换为大写
3.服务器将修改好的数据再次发送给客户端
4.客户端接收到服务器发送来的数据,并将其显示出来

UDP套接字编程

必须要先运行服务器端程序,保证服务器是处于运行状态的,客户端才能跟服务器进行通信。

UDP不需要先经过三次握手确保建立了连接,所以要在每个要传输的报文上携带目的地址

790334-20170423093427069-611627382.png

客户端代码:

# -*- coding:utf-8 -*-from socket import *#设置服务器主机名或者IP地址serverName = '127.0.0.1'#设置主机的接收进程,即端口号serverPort = 12000#创建客户端套接字,AF_INET指示底层用IPv4, SOCK_DGRAM指定是UDP套接字不是TCP套接字clientSocket = socket(AF_INET,SOCK_DGRAM)#客户端提示用户输入信息message = raw_input("Input lowercase sentence:")#发送报文到目的地#sendto()方法为报文附上目的地址,并且向进程的套接字clientSocket发送结果分组clientSocket.sendto(message, (serverName, serverPort))#当有数据到达客户端的套接字时,使用recvfrom()方法接收,指定缓存长度为2048modifiedMessage, serverAddress = clientSocket.recvfrom(2048)#打印刚刚接收到的信息print modifiedMessage, serverAddress#关闭套接字clientSocket.close()

服务器端代码:

# -*- coding:utf-8 -*-from socket import *#定义一个端口号serverPort = 12000#实例化一个服务器端的套接字,AF_INET指定使用IPv4,SOCK_DGRAM指定使用UDPserverSocket = socket(AF_INET, SOCK_DGRAM)#为服务器端套接字绑定一个端口serverSocket.bind(('', serverPort))print "The server is ready to receive"#处于循环监听状态while True:    #当有数据到达本地的12000端口的套接字处时,使用recvfrom()接收    message, clientAddress = serverSocket.recvfrom(2048)    #对接收到的数据进行处理    modifiedMessage = message.upper()    #使用sendto()发送数据到客户端    serverSocket.sendto(modifiedMessage, clientAddress)

TCP套接字编程

同样,先运行服务器端的程序

TCP需要先经过三次握手在客户端和服务器之间连接连接,然后再传输数据,所以,在建立连接时需要指定目的地址,而在传输数据时就不需要再附带目的地址数据了。

需要注意的是:服务器监听所有客户端发来的连接请求,如果发现有请求,就为其建立一个新的连接来传输数据。

790334-20170423093437601-285981934.png

客户端程序:

# -*- coding:utf-8 -*-from socket import *#服务器端的IP地址或名称和端口号serverName = '127.0.0.1'serverPort = 12000#实例化套接字,SOCK_STREAM指定使用的是TCP协议clientSocket = socket(AF_INET, SOCK_STREAM)#客户端和服务器端建立连接clientSocket.connect((serverName, serverPort))#提示用户输入信息sentence = raw_input("Input lowercase sentence:")#客户端发送数据到服务器,此处不同于UDP#此处没有为数据指定地址,是因为已经和服务器建立和连接,可以直接通信了clientSocket.send(sentence)#接收返回的数据modifiedSentence = clientSocket.recv(1024)#打印显示服务器端发回来的数据print 'From Server:', modifiedSentence#关闭客户端套接字连接clientSocket.close()

服务器端程序:

# -*- coding:utf-8 -*-from socket import *#定义端口号变量serverPort = 12000#实例化服务端套接字,SOCK_STREAM指定使用TCP协议serverSocket = socket(AF_INET, SOCK_STREAM)#为套接字绑定端口号serverSocket.bind(('', serverPort))#监听来自客户端的请求,其中参数定义了最大连接数serverSocket.listen(1)print 'The server is ready to receive'#循环监听while 1:    #服务器监听到来自客户端的请求,使用accept()为其创建一个新的专用的连接。    #此处不同与UDP,TCP在经过公用的三次握手之后,为其建立一个新连接供其传输数据    connectionSocket, addr = serverSocket.accept()    #接收客户端发送来的数据    sentence = connectionSocket.recv(1024)    #操作接收到的数据    capitalizedSentence = sentence.upper()    #发送数据到客户端    connectionSocket.send(capitalizedSentence)    #断开连接    connectionSocket.close()

转载于:https://www.cnblogs.com/cenyu/p/6751658.html

你可能感兴趣的文章
约瑟夫环问题
查看>>
《从零开始学Swift》学习笔记(Day 59)——代码排版
查看>>
产生滚动条时JPanel的大小发生变化
查看>>
ElasticSearch的基本用法与集群搭建
查看>>
9、spss做交叉表检验和对应分析
查看>>
VSFTP的PASSIVE模式的防火墙设置
查看>>
ArcGIS图层介绍
查看>>
Android--Fragment基本介绍
查看>>
AbstractQueuedSynchronizer的介绍和原理分析
查看>>
【MySql】 BlackHole :黑洞引擎
查看>>
iOS开发之网络编程--1、NSURLSession的基本使用
查看>>
从Google搜索联想到了jQuery
查看>>
【JavaScript】正则表达式
查看>>
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
查看>>
轻松自动化---selenium-webdriver(python) (六)
查看>>
There is insufficient system memory to run this query 错误
查看>>
基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
查看>>
我们奋斗着并将持续奋斗 ----暨清华D-Lab创新基地揭牌仪式
查看>>
MySQL主从同步相关-主从多久的延迟?
查看>>
keepalived track script introduce
查看>>