解决粘包问题终极版

服务端:

import socketimport subprocessimport structimport json#买手机server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#print(phone)#绑定手server.bind((‘192.168.0.102‘, 8080))server.listen(5)while True:    conn, cent = server.accept()    while True:        try:            cmd = conn.recv(1024)            obj = subprocess.Popen(cmd.decode(‘utf-8‘), shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)            stdout = obj.stdout.read()            stderr = obj.stderr.read()            # 第一步制作固定长度报头            header_dic = {‘md5‘:‘ssssss‘,                          ‘filename‘:‘a.txt‘,                          ‘total_saze‘:len(stdout)+len(stderr)}            head_json = json.dumps(header_dic)            head_bytes = head_json.encode(‘utf-8‘)            #第二部发送报头长度            conn.send(struct.pack(‘i‘, len(head_bytes)))

            # total_saze = len(stdout)+len(stderr)            # header = struct.pack(‘i‘, total_saze)            #第三步发送报头            conn.send(head_bytes)            #第四步发送真是数据            conn.send(stdout+stderr)

        except ConnectionResetError:            break    conn.close()server.close()

客户端:
import socketimport structimport json#买手机client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#拨号client.connect((‘192.168.0.102‘, 8080))while True:    cmd = input(‘请输入你的指令>>>‘)    client.send(cmd.encode(‘utf-8‘))

    # 第一步接收报头长度    obj = client.recv(4)    head_saze = struct.unpack(‘i‘, obj)[0]    #header = client.recv(4)    #第二步再收报头    head_bytes = client.recv(head_saze)    # 第三步从报头中解释出报头包含的所有信息    head_json = head_bytes.decode(‘utf-8‘)    head_dic = json.loads(head_json)    print(head_dic)

    total_saze = head_dic[‘total_saze‘]    print(total_saze)    # 第四步接收真实数据    recv_save = 0    data_recv = b‘‘    while recv_save < total_saze:        res = client.recv(1024)        data_recv+=res        recv_save+=len(res)    #data = client.recv(1024)    print(len(data_recv.decode(‘GBK‘)),‘\n‘,data_recv.decode(‘GBK‘))client.close()

原文地址:https://www.cnblogs.com/yuexijun/p/11480099.html

时间: 2024-10-19 18:49:57

解决粘包问题终极版的相关文章

解决粘包问题-终极版

server------------------ #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socketimport subprocessimport structimport json phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR

解决粘包问题终极方法

解决粘包问题终极方法 #server粘包 import socket import subprocess import struct soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.bind(('127.0.0.1',8001)) soc.listen(3) while True: print('等待客户端连接') conn,addr=soc.accept() print('有个客户端连接上了',addr) while True:

解决粘包问题-强化版

server------------------ #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socketimport subprocessimport struct phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)phone.b

Python网络编程03/ low版解决粘包问题

目录 Python网络编程03/ low版解决粘包问题 1.操作系统的缓存区 2.基于TCP协议的socket循环通信 2.1 服务端(server) 2.2客户端(client) 3.基于TCP协议的socket链接+循环 通信 3.1服务端(server) 3.2 客户端(client) 4.基于TCP协议的socket应用实例:执行远程命令 4.1服务端(server) 4.2客户端(client) 5.粘包现象 5.1服务端(server) 5.2客户端(client) 5.3展示收发问

Python网络编程04/recv原理/高大上版解决粘包方式

目录 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 2.recv工作原理 3.高大上版解决粘包方式(自定制报头) 3.1 解决思路: 3.2 服务端 3.3客户端 4.基于UDP协议的socket通信 4.1服务端 4.2客户端 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 1. 通信循环 2. 链接通信循环 3. 远程执行命令: subprocess.Popen() # bytes: 网络传输, 文件存储时. 4. 粘包现象

101 解决粘包问题

目录 一.什么是粘包 二.tcp发送数据的四种情况 三.struct模块 四.解决粘包问题 4.1 简单版解决方案 4.1 终极版解决方案(xc版本) 一.什么是粘包 粘包问题是所有语言中都会有的问题,因为只要使用了TCP协议,即使是通过socket编程也都会产生的问题. 注意:只有TCP有粘包现象,UDP永远不会粘包,为何,且听我娓娓道来. 首先需要掌握一个socket收发消息的原理 发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,

NetworkComms c#通信框架与Java的Netty框架通信 解决粘包问题

上次写了一篇文章  基于networkcomms V3通信框架的c#服务器与java客户端进行通信之Protobuf探讨 其中没有解决粘包问题,抛砖引玉,文章得到了失足程序员 老师的点评,并给出了解决方案:[最多评论]java netty socket库和自定义C#socket库利用protobuf进行通信完整实例(10/591) » 于是马上开始学习,并把c#服务器端换成了我比较熟悉的networkcomms v3 c#通信框架(商业版,本文并不提供) ,以方便与已经存在的系统进行整合. 客户

粘包产生的原因 socket 基于tcp实现远程执行命令(解决粘包)low

# 粘包产生的原因 # 粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的. # 基于tcp协议的套接字会有粘包现象,而基于udp协议的套接字不会产生粘包现象 # tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住:而udp是基于数据报的,即使你输入的是空内容,那也不是空消息,udp协议会帮你封装上消息头(ip+端口的方式),这样就有了消息办界 # 两种情况下会发生粘包 # 1.发送端需要等缓冲区满才发送

用readn与written实现解决粘包问题

总结一些我们在平时使用vim编辑器的一些实用功能,后续会一直更新. 1.  visual插件 visual插件其实相当于一个书签作用,比如我们在一篇很长的源代码文件中,我们可以标记一行,然后后来我们再想回到这一行时,只需要一个快捷键就能迅速定位到这一行,非常方便,不用不停地往上或往下翻. 1.1  常用命令 1.  mm标记一个标签: 2.  F2回到被标记的那一行: 3.  连续按两次mm就可以取消标签: 4.  shift+F2可以在几个标签来回切换: 2.  emmet.vim插件 emm