python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题
socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果。这就出现象第一次接受结果不全,第二次接果出现第一次结果。
比如send 1900 数据,recv 只接受1024。多于数据900放在缓存区里,第二次命令来的时候,调用send会先把900发回去,在把新数据放到缓存区,等到1024在系统会自动发送过去。
发送数据,一是缓存区满,二是超时
解决办法:
在发送数据前,计算发送数据的大小,把大小发给对方。对方接受数据循环,只到接到数据和大小一样。
二:示例代码
服务器# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
import socket
import subprocess
server=socket.socket()
server.bind(("127.0.0.1",9999))
server.listen(5)
while True:
conn,addr=server.accept()
print("new conn:",addr)
while True:
print(addr)
data=conn.recv(1024)
print(len(data))
print(data.decode())
if not data:
print("conn close ",addr)
break
print(data.decode())
cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
outread=cmd_res.stdout.read()
print(outread.decode("gb2312"))
conn.send(outread)
客户端# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
import socket
client=socket.socket()
client.connect(("127.0.0.1",9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:continue
print(cmd)
client.send(cmd.encode("utf-8"))
print("res")
res=client.recv(1024)
print(res.decode("gb18030"))
大数据发送结果乱问题现象截图:
三:解决代码如下:
服务器端# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
import socket
import subprocess
server=socket.socket()
server.bind(("127.0.0.1",9999))
server.listen(5)
while True:
conn,addr=server.accept()
print("new conn:",addr)
while True:
print(addr)
data=conn.recv(1024)
print(len(data))
print(data.decode())
if not data:
print("conn close ",addr)
break
print(data.decode())
cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
outread=cmd_res.stdout.read()
print(len(outread))
conn.send(("%s" %len(outread)).encode("utf-8"))
print(outread.decode("gb2312"))
conn.send(outread)
# -*- coding:utf-8 -*-__author__ = 'shisanjun'
import socket
client=socket.socket()
client.connect(("127.0.0.1",9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:continue
print(cmd)
client.send(cmd.encode("utf-8"))
print("res")
res_size=client.recv(1024).decode("utf-8")
size=0
while size<int(res_size):
res=client.recv(1024)
print(res.decode("gb18030"))
size+=len(res) #这里要用len(),因为最后一次长度不固定
以上是 python网络编程-socket发送大数据包问题 的全部内容, 来源链接: utcz.com/z/387128.html