无注释版

os.popen()模式

server端

import socket
import osphone = socket.socket()
phone.bind(("localhost",8088))
phone.listen()while 1:conn,addr = phone.accept()while 1:try:from_client_data = conn.recv(1024)if from_client_data.upper() == b'Q':print("客户端退出")breakprint(from_client_data.decode('utf-8'))cmd_res = os.popen(from_client_data.decode("utf-8")).read()if len(cmd_res) == 0:cmd_res = "cmd hs no output..."print(len(cmd_res.encode('gbk')))conn.send(str(len(cmd_res.encode('gbk'))).encode('gbk'))client.ack = conn.recv(1024)conn.send(cmd_res.encode('gbk'))except ConnectionResetError:breakconn.close()
phone.close()

client端

import socket
phone = socket.socket()
phone.connect(('localhost',8088))
while 1:client_data = input(">>>")if not client_data:print("发送的内容不能为空")continuephone.send(client_data.encode("utf-8"))if client_data.upper() == "Q":quit()else:server_data = phone.recv(1024)phone.send("准备好接收了".encode('utf-8'))total_size = int(server_data.decode('gbk'))total_data = b''while 1:if len(total_data) < total_size:total_data += phone.recv(1024)print(len(total_data))else:breakprint(total_data.decode('gbk'))
phone.close()

struct模块解决粘包

server端

import socket
import subprocess
import structphone = socket.socket()
phone.bind(("localhost",8088))
phone.listen(5)while 1:conn,addr = phone.accept()print(addr)while 1:try:from_client_data = conn.recv(1024)if from_client_data.upper() == b'Q':print("客户端退出")breakprint(from_client_data.decode('utf-8'))obj = subprocess.Popen(from_client_data.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,)ret = obj.stdout.read()+obj.stderr.read()total_size = len(ret)header = struct.pack('i',total_size)print(total_size)conn.send(header)conn.send(ret)except ConnectionResetError:breakconn.close()
phone.close()

client端

import socket
import struct
phone = socket.socket()
phone.connect(('localhost',8088))
while 1:client_data = input(">>>")if not client_data:print("发送的内容不能为空")continuephone.send(client_data.encode("utf-8"))if client_data.upper() == "Q":quit()else:server_data = phone.recv(4)total_size = struct.unpack('i',server_data)[0]total_data = b''while 1:if len(total_data) < total_size:total_data += phone.recv(1024)print(len(total_data))else:breakprint(total_data.decode('gbk'))# print(int(server_data.decode('gbk')))
phone.close()

有注释版

os.popen()模式

server端

import socket
import osphone = socket.socket() # 实例化一个socket对象phone.bind(("localhost",8088)) # 绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址phone.listen(5) #   开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。while 1: # 开启循环,多个用户同时连接(当然不是并发,排队连接)conn,addr = phone.accept()# 被动接受TCP客户端连接,(阻塞式)等待连接的到来,会有两个值,conn我也不明白是什么值,addr是客户端连接的地址while 1: # 客户端与服务端多次对话,客户端多次执行循环try: # 异常处理,客户端直接退出ConnectionResetError错误from_client_data = conn.recv(1024) # 接收客户端数据if from_client_data.upper() == b'Q': # 判断客户端输入是否是q或Q,如果是q,直接退出当前连接print("客户端退出")breakprint(from_client_data.decode('utf-8')) # 输出客户端转码后的数据cmd_res = os.popen(from_client_data.decode("utf-8")).read() # 执行os命令,通过popen执行cmd命令if len(cmd_res) == 0: # 如果没有该命令,返回下面结果cmd_res = "cmd hs no output..."conn.send(str(len(cmd_res.encode('gbk'))).encode('gbk')) # 发送数据,首先计算cmd_res的gbk字节长度,然后转换成字符串发送给客户端,因为int型不能发送print(len(cmd_res.encode('gbk'))) # 输出该命令返回的长度conn.send(cmd_res.encode('gbk')) # 执行一个接收,截断上下两个的粘包conn.send(cmd_res.encode('gbk')) # 发送给客户端except ConnectionResetError:breakconn.close() # 关闭连接
phone.close() # 关闭连接

client端

import socket
phone = socket.socket() # 实例化对象
phone.connect(('localhost',8088)) # 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
while 1: # 循环输入client_data = input(">>>")if not client_data: # 如果输入为空,not client_data 则为Trueprint("发送的内容不能为空")continuephone.send(client_data.encode("utf-8")) # 给服务端发送信息if client_data.upper() == "Q": # q退出quit()else:server_data = phone.recv(1024) # 接收返回的字节长度phone.send("准备好接收了".encode('utf-8')) # 给服务端发送消息,阻塞服务端上下造成粘包的问题(low版)total_size = int(server_data.decode('gbk')) # 接收到的是字符串,转换成整型total_data = b'' # 刚开始设置为0,空字符串则为0,前面加b表示字节while 1: # 如果我收到的字节小于total_size,则一直循环if len(total_data) < total_size:total_data += phone.recv(1024) # 每次把信息加到total_data中print(len(total_data))else:breakprint(total_data.decode('gbk')) # 输出返回的结果
phone.close() # 关闭连接

struct模块解决粘包

server端

import socket
import subprocess
import structphone = socket.socket() # 实例化一个socket对象
phone.bind(("localhost",8088))
# 绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址
phone.listen(5)
#   开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。while 1:# 开启循环,多个用户同时连接(当然不是并发,排队连接)conn,addr = phone.accept()# 被动接受TCP客户端连接,(阻塞式)等待连接的到来,会有两个值,conn我也不明白是什么值,addr是客户端连接的地址print(addr)while 1: # 客户端与服务端多次对话,客户端多次执行循环try: # 异常处理,客户端直接退出ConnectionResetError错误from_client_data = conn.recv(1024) # 接收客户端数据if from_client_data.upper() == b'Q': # 判断客户端输入是否是q或Q,如果是q,直接退出当前连接print("客户端退出")breakprint(from_client_data.decode('utf-8'))  # 输出客户端转码后的数据obj = subprocess.Popen(from_client_data.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,)# subprocess 模块中的代码# shell: 命令解释器,相当于调用cmd 执行指定的命令。# stdout:正确结果丢到管道中。# stderr:错了丢到另一个管道中。# windows操作系统的默认编码是gbk编码。ret = obj.stdout.read()+obj.stderr.read() # 加的是字节# 正确的输出跟错误的输出加起来,因为正确输出时,错误输出为空,所以加起来相当于0+1,没什么区别total_size = len(ret) # 计算返回命令的长度header = struct.pack('i',total_size) # 将一个数字转化成等长度的bytes类型。print(total_size) # 打印出返回命令的长度conn.send(header) # 发送固定长度的报头conn.send(ret) # 给客户端发送返回命令的结果except ConnectionResetError: breakconn.close() # 关闭连接
phone.close() # 关闭连接

client端

import socket
import struct
phone = socket.socket() # 实例化对象
phone.connect(('localhost',8088)) # 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
while 1: # 循环输入client_data = input(">>>")if not client_data: # 如果输入为空,not client_data 则为Trueprint("发送的内容不能为空")continuephone.send(client_data.encode("utf-8")) # 给服务端发送信息if client_data.upper() == "Q": # q退出quit()else:server_data = phone.recv(4) # 接收报头长度total_size = struct.unpack('i',server_data)[0] # 反解报头total_data = b''  # 刚开始设置为0,空字符串则为0,前面加b表示字节while 1: # 如果我收到的字节小于total_size,则一直循环if len(total_data) < total_size: total_data += phone.recv(1024)  # 每次把信息加到total_data中print(len(total_data))else:breakprint(total_data.decode('gbk')) # 输出返回的结果,windows默认gbk# print(int(server_data.decode('gbk')))
phone.close() # 关闭连接

转载于:https://www.cnblogs.com/alex3174/p/11360954.html

解决socket粘包的两种low版模式 os.popen()和struct模块相关推荐

  1. Socket粘包问题终极解决方案—Netty版(2W字)!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 上一篇我们写了<Socket粘包问题的3种解决方案>,但没想到评论区竟 ...

  2. 关于php中Socket粘包问题的3种解决方案,不断提升质量

    在 Java 语言中,传统的 Socket 编程分为两种实现方式,这两种实现方式也对应着两种不同的传输层协议:TCP 协议和 UDP 协议,但作为互联网中最常用的传输层协议 TCP,在使用时却会导致粘 ...

  3. netty解决TCP粘包/拆包导致的半包读写问题的三种方案

    解决方案一:LineBasedFrameDecoder+StringDecoder来解决TCP的粘包/拆包问题 只需要在客户端和服务端加上45.46两行代码并且在发送消息的时候加上换行符即可解决TCP ...

  4. Linux socket编程(一):客户端服务端通信、解决TCP粘包

    一.服务端程序 服务端程序工作流程: 创建socket →\rightarrow→ 绑定监听的IP地址和端口 →\rightarrow→ 监听客户端连接 →\rightarrow→ 接受/发送数据.对 ...

  5. Socket粘包问题

    这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接: 1.长连接 Client方与Server方先建立 ...

  6. TCP Socket 粘包

     这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题.发现自己不是非常清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接: 1.长连接 Client方与Server ...

  7. golang解决TCP粘包问题

    6行代码解决golang TCP粘包 转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用gola ...

  8. golang中tcp socket粘包问题和处理

    http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格 ...

  9. (Java)socket网络编程及处理socket粘包拆包问题

    目录 1.socket简介 2.TCP/IP协议 3.tcp三次握手 4.socket的一些接口函数原理 5.java socket 长连接粘包拆包问题 6.socket模拟服务端客户端发消息 7.U ...

最新文章

  1. VTK:网格之ClipFrustum
  2. java 遍历 likedlist_Java集合02----LinkedList的遍历方式及应用
  3. idea jdk编译报错解决办法
  4. IDEA的Maxcomputer Studio开发
  5. Android自动打包、签名、优化、上传ANT脚本
  6. CS231n李飞飞计算机视觉 迁移学习之物体定位与检测下
  7. 制作业信息化为什么难施行?
  8. java mvc demo_SpringMvcDemo 一个简单的 mvc 的 实现例子 Java Develop 259万源代码下载- www.pudn.com...
  9. unb计算机科学,【加拿大新布伦瑞克大学】加拿大UNB_University of New Brunswick - 加拿大大学 - 加拿大留学云...
  10. WinXP如何自动清理Temp文件夹
  11. python requests 异步调用_python - 如何使用requests_html异步获取()URL列表? - 堆栈内存溢出...
  12. 如何保障微服务架构下的数据一致性
  13. 西安电子科大计算机学院院长,董伟生 | 个人信息 | 西安电子科技大学个人主页...
  14. ML之FE:特征工程处理中常用的数据变换(log取对数变换等)之详细攻略
  15. java reflection 作用,全方位解读Java反射(reflection)
  16. C语言如何做手机游戏,C语言怎样实现一个简单的手机游戏小项目
  17. 攻击CSK靶机环境并学习linux渗透思路
  18. C++语言程序设计第五版 - 郑莉(第二章课后习题)
  19. NB 的开源项目遍地开花——GitHub 热点速览 Vol.41
  20. Visual Studio 2010打开工程提示“未知错误”解决办法

热门文章

  1. ORA-03001,GATHER_TABLE_STATS数据库自动收集统计信息报错
  2. p2596 书架(Treap)
  3. 前端页面适配的rem换算
  4. WIFI搜索的到别人,却找不到自己家的wifi
  5. easy_runner一个简单的压测程序
  6. Exchange 2016 先决条件
  7. 取消chrome下input和textarea的聚焦边框
  8. EasyUI 1.3.6 行号显示不全
  9. 从搜索引擎到社交网络的艰难转变
  10. ACS AD 和本地验证SSL ×××