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

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()

原文地址:https://www.cnblogs.com/yangzhen-ahujhc/p/12311102.html

时间: 2024-08-30 15:45:53

解决缓存不够无法接收全部数据和粘包问题的相关文章

接收socket数据的粘包处理

//粘包解决方法,格式<x>XXXXXXXXXXXX</x> ?? ??? ?public void readMess(String message){ ?????????? //存放数据 ?? ??? ??? ?data = data+message; ?? ??? ??? ?try{ ???????? //循环是数据可能有多个<x>XXX</x><x>XXX</x>................. ?? ??? ??? ? wh

解决:springmvc中接收date数据问题

这里提供三种解决方案. 一.局部转换 :只是对当前Controller类有效 springMVC.xml中添加: <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="

《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 9. 协议过滤器,解决一包多发.粘包.冗余数据... 2 9.1  概述... 2 9.2 实际问题... 2 9.3 5种过滤器及二次开发... 5 9.4 设备驱动开发注意事项... 6 9.5 宿主程序服务实例配置注意事项... 6 9. 协议过滤器,解决一包多发.粘包.冗余数据    9.1    概述 通讯中涉及到数据包的概念,是通讯协议中的数据组成形式.针对这块内容,说简单

TCP粘包问题分析和解决(全)

TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小.数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,

解决粘包和拆包问题

解决粘包和拆包问题 上一篇我们介绍了如果使用Netty来开发一个简单的服务端和客户端,接下来我们来讨论如何使用解码器来解决TCP的粘包和拆包问题 我们知道,TCP是以一种流的方式来进行网络转播的,当tcp三次握手简历通信后,客户端服务端之间就建立了一种通讯管道,我们可以想象成自来水管道,流出来的水是连城一片的,是没有分界线的. TCP底层并不了解上层的业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分. 所以对于我们应用层而言.我们直观是发送一个个连续完整TCP数据包的,而在底层就可

TCP通信粘包问题分析和解决

TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小.数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,

Netty解决粘包和拆包问题的四种方案

在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使用的同一个连接,这样就会产生粘包和拆包的问题.本文首先会对粘包和拆包问题进行描述,然后介绍其常用的解决方案,最后会对Netty提供的几种解决方案进行讲解.这里说明一下,由于oschina将"jie ma qi"认定为敏感文字,因而本文统一使用"解码一器"表示该含义 粘包

TCP的粘包问题以及数据的无边界性

服务端: #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll   #define BUF_SIZE 100   int main(int argc, char *argv[]){     //初始化 DLL     WSADATA wsaData;     WSAStartup( MAKEWORD(2, 2), &wsa

C/C++ socket编程教程之九:TCP的粘包问题以及数据的无边界性

C/C++ socket编程教程之九:TCP的粘包问题以及数据的无边界性 上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据.也就是说,read()/recv() 和 write()/send() 的执行次数可能不同. 例如,write()/send() 重复执行三次,每次都发送字符串"abc",那么目标机器上的 read()/recv() 可能分三次接收,每次都接收"