粘包现象 粘包解决方案

-------------------------------如果事情无法改变,那就改变自己;如果无法说服他人,那就想法说服自己。如果山过不来,那人就过去!

 # ------------------------------------------------------------------------------------------------------------#
 day 28 今日内容
粘包现象:
粘包1:连续的小包,会被优化机制给合并
粘包2:服务端一次性无法完全就收完客户端发送的数据,第二再次接收的时候,会接收到第一次遗留的内容

解决粘包的方案:
方案1:先告诉客户端,数据信息的长度,然后等客户端确认之后,再发送真实内容
方案2:通过struct模块,将要发送的真实数据的长度进行打包,打包成4个字节,和真实数据一起一次性发送个客户端.客户端取出前4个字节,通过struct解包获得后面真实数据的长度,根据这个长度再进行数据的接受
合法性链接验证


明日预习:
Socketserver
# # --------------[粘包方案解决-客户端]--------------
import json
import socket
import struct
client = socket.socket()
ip_port = ('127.0.0.1',8001)
client.connect(ip_port)
all_recv_len = 0
all_data_byte = b''

while 1:
client_cmd = input('请输入系统指令>>>')
client.send(client_cmd.encode('utf-8'))
#先接收4个字节,这4个字节是真实数据长度加工成的
recv_data_len = client.recv(4)
#将4个字节长度的数据,解包成后面真实数据的长度
real_data_len = struct.unpack('i',recv_data_len)[0]

print(real_data_len)

server_result = client.recv(real_data_len)

print(server_result.decode('gbk'))
 
# # --------------[粘包方案解决-服务端]--------------
import socket
import subprocess
import struct
server = socket.socket()
ip_port = ('127.0.0.1',8001)
data_full_len = 0 #统计发送数据的长度
server.bind(ip_port)
server.listen()
conn,addr = server.accept()
while 1:
from_client_cmd = conn.recv(1024).decode('utf-8')

sub_obj = subprocess.Popen(
from_client_cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
#subprocess对象.read 得到的结果是bytes类型的
cmd_res = sub_obj.stdout.read()
data_len = len(cmd_res) #总数据长度
data_len_str = str(data_len)
print('结果长度>>>',data_len)

#将真实数据长度打包成4个字节的数据
struct_data_len = struct.pack('i',data_len)

conn.send(struct_data_len + cmd_res)


今日作业
1、什么缓冲区,为什么会有缓冲区?

2、写一个tcp写一下的socket对话程序,能够优雅的断开,让另外一个客户端连接上进行收发消息。

3、自行完成今天课上写的使用subprocess进行系统调用的对话方式,客户端发送指令,服务端执行指令并且将结果返回给客户端,确保不产生粘包

4、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

5、用tcp协议下的socket,写一个简易的文件上传下载的功能,用户需要登陆认证,认证成功后,客户端用户可以选择上传或者是下载,
上传的时候服务端提前设定好上传文件的路径,将文件上传到对应的路径下,下载文件的时候,服务端将之前设定好的上传路径中的所有
文件带上序号展示给用户看,用户输入文件序号后下载对应的文件,文件下载到客户端程序的当前路径下就可以了。

猜你喜欢

转载自www.cnblogs.com/dealdwong2018/p/10009456.html
今日推荐