解决缓存不够无法接收全部数据和粘包问题

Posted yangzhen-ahujhc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决缓存不够无法接收全部数据和粘包问题相关的知识,希望对你有一定的参考价值。

server程序如下:

import socket
sk=socket.socket()
print(sk)
address=(127.0.0.1,8888)
sk.bind(address)
sk.listen(3)
‘‘‘
服务器端不关闭,客户端输入exit后关闭,服务器接收下一个连接的内容,进行对话
‘‘‘
#方法一
# conn,addr=sk.accept()
# print(conn)
# while True:
#     data=conn.recv(1024)
#     if str(data,‘utf8‘)==‘‘:
#         conn,addr=sk.accept()
#         print(addr)
#         continue
#     print(str(data,‘utf8‘))
#     ssData=input(‘>>>‘)
#     conn.send(bytes(ssData,‘utf8‘))


#方法二
import subprocess

while True:
   conn, addr = sk.accept()
   while True:
       try:  #此时使用try是为了防止对方发送空字段信息
           data = conn.recv(1024)
           process=subprocess.Popen(str(data,utf8),shell=True,stdout=subprocess.PIPE)
           print(process)
           std_result=process.stdout.read()
           #print(std_result)
           length=len(std_result)
          # std_result=str(length)+‘|‘+str(std_result,‘utf8‘)
       except Exception as e:
           break
       if str(data, utf8) == ‘‘:
           break
       conn.sendall(bytes(str(length),utf8))
       #两个send在一起会发生粘包现象,此时只需要在两个send之间进行短暂停留,可以用time.sleep方法
       #也可以用conn.recv(),推荐使用这一种,此时需要修改客户端,客户端需要发送一个数据
       conn.recv(1024)
       conn.sendall(std_result)
       #conn.send(bytes(std_result,‘utf8‘))

client端代码如下:

import socket
sk2=socket.socket()
address=(127.0.0.1,8888)
sk2.connect(address)
print(sk2)
while True:
    cdata=input(>>>)
    if cdata==exit:
        break
    sk2.send(bytes(cdata,utf8))
    crdata=int(str(sk2.recv(1024),utf8))
    #对应服务端的recv此时需要发送一个数据,可以是任意数据
    sk2.send(bytes(ok,utf8))
   # print(crdata)
    #生成一个空的bytes类型的数据,用于组合接收到的数据
    #在接收数据,设置缓存大小的时候,因为不知道对方发送过来的数据大小,一般设置为8K,但是当对方
    #发送过来的数据大于这个值的时候,缓存无法全部接收,因此需要进行判断,在服务器端发送数据时,发送
    #一个数字是数据的大小,客户端接收数据的时候通过这个数字来判断是否接收完成,通过循环,反复接收
    data=bytes()
    while True:
        data += sk2.recv(512)
        if len(data)==crdata:
             break
        print(len(data))
        #此时输出两个数据类型,是因为原来传输过来的crdata是bytes类型,二len(data)是int型
        #因此在上面需要对bytes转换成int,而byte不能直接转成int,需要通过str进行中转
        print(type(len(data)))
        print(type(crdata))
    print(str(data,gbk))
sk2.close()

 

以上是关于解决缓存不够无法接收全部数据和粘包问题的主要内容,如果未能解决你的问题,请参考以下文章

UDP套接字和粘包

TCP网络通讯如何解决分包粘包问题(有模拟代码)

TCP-缓冲区和粘包、拆包有啥关系?

TCP 的断包和粘包

4-10:TCP协议之面向字节流和粘包问题

python 网络编程 缓冲和粘包