网络编程(五)

缓冲区的问题

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等等

粘包现象的高大上版代码:

扫描二维码关注公众号,回复: 5277801 查看本文章

基于UDP协议的socket通信

猜你喜欢

转载自www.cnblogs.com/liuer-mihou/p/10420229.html
今日推荐