粘包问题解决方案

粘包解决方案:

思路:服务端传输数据前 提前 告知客户端传输数据的大小

客户端

import  socket
import struct

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr = ('127.0.0.1',8000)

client.connect(addr)

while True:
    # 发送消息
    msg = input("请输入你要讲的话>>>>")
    client.send(bytes(msg.encode('utf8')))

    # 接受消息
    leng = client.recv(4)       # 提前接受客户端传输数据的大小
    date_lens = struct.unpack('i',leng)[0]  # 转化
    data = client.recv(date_lens)       # data_lens为服务端即将发来数据的大小
    print(data.decode('gbk'))

服务端

import  socket
import struct
import subprocess

service =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
addr = ('127.0.0.1',8000)
service.bind(addr)
service.listen(5)
conn,addr = service.accept()

while True:
    # 接受消息
    client_msg = conn.recv(1024)
    print(client_msg)
    common = client_msg.decode('utf8')
    print(common)
    obj = subprocess.Popen(common,
                     shell=True,
                     stderr=subprocess.PIPE,
                     stdout = subprocess.PIPE
                     )

    stderr = obj.stderr.read()
    stdout = obj.stdout.read()

    msg_len = len(stderr) + len(stdout) # 传输数据的长度
    one = struct.pack('i',msg_len)      # 转化

    conn.send(one)      # 告知client端 本次传入数据的大小
    conn.send(stdout+stderr)

使用UDP进行传输数据

客户端

import  socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

addr = ('127.0.0.1',8000)
msg = input("请输入你的内容>>>>")
client.sendto(bytes(msg.encode('utf8')),addr)   # 传输到服务端

data,addr = client.recvfrom(1024)       # 接受消息
print(data.decode('utf8'))

服务端

import socket
service = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
addr = ('127.0.0.1',8000)
service.bind(addr)

date,addr = service.recvfrom(1024)  # 接受消息
print(date.decode('utf8'))

service.sendto(date.upper(),addr)   # 发送消息

原文地址:https://www.cnblogs.com/plf-Jack/p/11105244.html

时间: 2024-07-31 07:03:23

粘包问题解决方案的相关文章

netty拆包/粘包的解决方案

netty拆包/粘包的解决方案 刚开始学拆包/粘包的时候确实不太好理解,我反复看了几遍就理解了.写下了加深记忆,也希望对大家有所帮助. 本章只介绍简单的二个工具LineBaseFrameDecoder和StringDecoder. 基础知识 1.首先图解拆包/粘包问题出现的原因 假设现在客户端向服务器端发送数据,在某一时间段上客户端分别发送了D1和D2二个数据包给服务器,由于服务器一次读取到的字节数是不确定的,故存在以下5种情况. 情况1:服务器分二次读取到了二个独立的数据包,分别是D1和D2,

AsyncSocket长连接粘包问题解决方案

工程中使用长连接来和服务器进行通讯,因此,我们的协议通过指定前两个字节为数据长度来区分数据包 app这边数据有两种传输形式: 1.app主动请求所需要的数据: 2.app异步接收来自服务端的推送消息,也就是app这边没有请求,服务端主动发送数据到app客户端: 整个app运行期间,它们都是在同一个连接上完成的数据传输,因此会出现以下的问题: 1.服务器数据传输过快,出现粘包的问题,例如 1.1服务端一次发来多个推送消息: 1.2网络不稳定,客户端连续发送多个请求客户端一次接收到全部答复: 2.客

Mina框架断包、粘包问题解决方案

Mina框架断包.粘包问题解决方案 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型. 在mina中,一般的应用场景用TextLine的Decode和Encode就够用了(Te

socket 的粘包问题解决方案

粘包: 由于接受recv有最大限制,管道中有大于最大限制字节时, 第二次recv的会是之前残留的信息,这种现象叫做粘包. TCP协议是面向连接的,面向流的,当在发送数据时接受方不知道要收多少字节的数据,但由于缓存区大小的限制,我们又不可能设置很大的接受量,这时便需要有一个解决方案,避免产生粘包的现象. 解决方案:明确地告知接收端要收多大的数据,在开始循环的接受数据 实例: 原文地址:https://www.cnblogs.com/captain08/p/9074416.html

TCP粘包以及解决方案

TCP协议粘包现象的说明: TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 即面向流的通信是无消息保护边界的. 粘包会发生什么? 这时候,接受不知道数据的限

libevent粘包分包解决方案:bufferevent + evbuffer

转自:http://blog.sina.com.cn/s/blog_9f1496990102vshz.html 原文:http://www.lvtao.net/c/631.html Libevent介绍 libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libeve

Netty中使用MessagePack时的TCP粘包问题与解决方案

[toc] Netty中使用MessagePack时的TCP粘包问题与解决方案 通过下面的实例代码来演示在Netty中使用MessagPack时会出现的TCP粘包问题,为了学习的连贯性,参考了<Netty权威指南>第7章中的代码,但是需要注意的是,书中并没有提供完整代码,提供的代码都是片段性的,所以我根据自己的理解把服务端的代码和客户端的代码写了出来,可以作为参考. 仍然需要注意的是,我使用的是Netty 4.x的版本. 另外我在程序代码中写了非常详细的注释,所以这里不再进行更多的说明. 在使

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

TCP作为常用的网络传输协议,数据流解析是网络应用开发人员永远绕不开的一个问题. TCP数据传输是以无边界的数据流传输形式,所谓无边界是指数据发送端发送的字节数,在数据接收端接受时并不一定等于发送的字节数,可能会出现粘包情况. 一.TCP粘包情况: 1. 发送端发送了数量比较的数据,接收端读取数据时候数据分批到达,造成一次发送多次读取:通常网络路由的缓存大小有关系,一个数据段大小超过缓存大小,那么就要拆包发送. 2. 发送端发送了几次数据,接收端一次性读取了所有数据,造成多次发送一次读取:通常是

netty解决tcp粘包拆包问题

tcp粘包拆包解决方案 1.发送定长的消息 server端:                    EventLoopGroup pGroup = new NioEventLoopGroup(); EventLoopGroup cGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(pGroup, cGroup)  .channel(NioServerSocketChannel.cl