缓冲区的问题
recv的问题
解决粘包现象的高大上版
基于UDP协议的socket通信
SocketServer的源码解析
缓冲区的问题:
缓冲区的作用:暂存一些数据,防止网络卡顿,recv不到数据,不会影响recv的效率
recv的问题
# 1.客户端send一次就关闭,服务端recv完数据才关闭 import socket sk=socket.socket() sk.bind(('127.0.0.1',8888)) sk.listen() conn,addr=sk.accept() data1=conn.recv(2) print(data1) data2=conn.recv(2) print(data2) data3=conn.recv(1) print(data3) conn.close() sk.close() # 结果: # b'he' # b'll' # b'o' # 2.客户端send完数据,不关闭,服务端recv完数据,在recv会阻塞 # import socket sk=socket.socket() sk.bind(('127.0.0.1',8888)) sk.listen() conn,addr=sk.accept() data1=conn.recv(5) print(data1) print(1111) data2=conn.recv(2) print(2222) print(data2) conn.close() sk.close() # 结果: # b'hello' # 1111运行完1111后程序会阻塞在recv # 2222 # b'' # 3.客户端send一次就关闭,服务端recv完数据,再次recv会接收b'' import socket sk=socket.socket() sk.bind(('127.0.0.1',8888)) sk.listen() conn,addr=sk.accept() data1=conn.recv(5) print(data1) data2=conn.recv(2) print(data2) conn.close() sk.close() # 结果: # b'hello' # b''server端
# 1. import socket sk=socket.socket() sk.connect(('127.0.0.1',8888)) sk.send(b'hello') sk.close() # 2 import socket import time sk=socket.socket() sk.connect(('127.0.0.1',8888)) sk.send(b'hello') time.sleep(5) sk.close() # 3. import socket sk=socket.socket() sk.connect(('127.0.0.1',8888)) sk.send(b'hello') sk.close()client端
粘包现象low版low的原因:
1.如果数据长度过大,struct得到的字节会报错
2.如果上传下载一个文件(视频,音频,文字类文件)自定义一个报头:文件名,文件路径,文件大小,md5等等
粘包现象的高大上版代码:
基于UDP协议的socket通信