标签:接收 导入 back 通信 就是 tcp 缓冲区 系统 数据流
基于UDP的socket
面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端
由于UDP是面向无连接的(实际上有链接,不然通过什么去传数据去取数据),可以使用多个客户端连接服务端,但这并不是并发访问。
注意:
1. 发消息,都是将数据发送到己端的发送缓冲中,收消息都是从己端的缓冲区中收
tcp:send发消息,recv收消息
udp:sendto发消息,recvfrom收消息
2. tcp是基于数据流的,而udp是基于数据报的:
send(bytes_data):发送数据流,数据流bytes_data若为空,自己这段的缓冲区也为空,操作系统不会控制tcp协议发空包
sendinto(bytes_data,ip_port):发送数据报,bytes_data为空,还有ip_port,所有即便是发送空的bytes_data,数据报其实也不是空的,自己这端的缓冲区收到内容,操作系统就会控制udp协议发包。
3.1 tcp协议
(1)如果收消息缓冲区里的数据为空,那么recv就会阻塞(阻塞很简单,就是一直在等着收)
(2)只不过tcp协议的客户端send一个空数据就是真的空数据,客户端即使有无穷个send空,也跟没有一个样。
(3)tcp基于链接通信
3.2 udp协议
(1)如果如果收消息缓冲区里的数据为“空”,recvfrom也会阻塞
(2)只不过udp协议的客户端sendinto一个空数据并不是真的空数据(包含:空数据+地址信息,得到的报仍然不会为空),所以客户端只要有一个sendinto(不管是否发送空数据,都不是真的空数据),服务端就可以recvfrom到数据。
(3)udp无链接
实现代码
服务端:
#导入socket模块 import socket #创建socket skt = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #绑定地址和端口 skt.bind((‘127.0.0.1‘,9090)) #循环 while True: #调用接受消息 data,addr = skt.recvfrom(1024) #接受成功回复消息 rst = b‘I am fine‘ skt.sendto(rst,addr) print(‘server Done‘) #关闭链接 skt.close()
客户端
#导入模块 import socket #创建socket skt = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #创建发送消息和发送目标 msg = b‘Hello world‘ addr = (‘127.0.0.1‘,9090) skt.sendto(msg,addr) #接受回复 rst = skt.recvfrom(1024) print(rst) print(‘client done‘) #关闭链接 skt.close()
标签:接收 导入 back 通信 就是 tcp 缓冲区 系统 数据流
原文地址:http://www.cnblogs.com/yuxiang-qiwa/p/7965980.html