python socket 连续send,出现粘包问题
使用网上socket代码实现ssh功能,如下:
server.py
#服务端Linux系统下:处理命令并返回
import socket
import os
#声明类型,生成socket链接对象
server = socket.socket()
#监听接收端口元组(本地,端口),绑定要监听的端口
server.bind(('localhost',6969))
#最大监听数,允许多少人在排队
server.listen(5)
while True: #循环锁定访问客户端
print("等待执行指令")
conn,addr = server.accept() #返回链接的标记位conn,与连接的地址
print(conn, addr) #客户端同过conn,addr进行通话,conn就是客户端连接过来而在服务器端为其生成的一个连接实例
while True: #循环处理客户端请求
print(conn)
data = conn.recv(1024) #1.接收数据,默认1024字节,缓冲区每次最多发32768,每个系统不同,超出数值会有限制。字节如果发不完会存在缓冲去,下次在发送
print('输入命令为:',data.decode('utf-8'))
#Linux系统内可以判断是否为空。
if not data:
print('断开链接')
break
#执行命令,赋值给变量
res = os.popen(data.decode('utf-8')).read()
print('服务段执行命令后得到数据的size:',len(res))
if len(res)==0:
res='输入命令有误,请重新输入'
# 返回res的总长度
conn.send(str(len(res)).encode('utf-8')) #len(str)为整数,需要变成字符格式才能使用encode方法
#返回res详细结果
conn.send(res.encode('utf-8'))
#sendll就是循环send,用法发送大型文件。
#conn.sendll(res)
continue
#关闭链接
server.close()
client.py
#客户端Linux系统下:输入命令通过服务端返回
import socket #声明协议类型,同事生成socket连接对象
client = socket.socket() #链接地址和端口,元组(本地,端口)
client.connect(('localhost',6969)) #使用input循环向服务端发送请求
while True:
cmd = input(">>:").strip()
if len(cmd) == 0:
continue #发送数据 b将字符串转为bys类型
client.send(cmd.encode("utf-8")) #send只能发送bytes格式数据
#接收服务器端的返回(长度和详细内容),需要声明收多少,默认1024字节
cmd_res_size = client.recv(1024)
print(type(int(cmd_res_size.decode('utf-8'))))
print('客户端收到执行后的命令长度:',cmd_res_size.decode('utf-8'))
received_size =0
received_data = b''
while received_size < int(cmd_res_size.decode('utf-8')):
cmd_res = client.recv(1024)
received_size += len(cmd_res)
received_data += cmd_res
else:
print('接收完成') #打印data是recv的data
#print("recv_len:",cmd_res_len.decode('utf-8'))
print("recv:",received_data.decode('utf-8')) #关闭接口
client.close() 上述代码主要功能实现client端输入Linux命令,传送到server端执行并将命令执行结果返回client端,但有时候因为server.py中
# 返回res的总长度
conn.send(str(len(res)).encode('utf-8')) #len(str)为整数,需要变成字符格式才能使用encode方法
#返回res详细结果
conn.send(res.encode('utf-8')) 连续发送数据,出现粘包,导致在client.py 中处理
cmd_res_size = client.recv(1024)
print(type(int(cmd_res_size.decode('utf-8')))) 取到cmd_res_size不为整数,导致int(cmd_res_size.decode('utf-8'))语句报错 修改socket粘包问题方法如下: 1、添加time.sleep(0.2)
# 返回res的总长度
conn.send(str(len(res)).encode('utf-8')) #len(str)为整数,需要变成字符格式才能使用encode方法
time.sleep(0.2)
#返回res详细结果
conn.send(res.encode('utf-8'))
2、在server和client之间添加个一个交互

python socket 连续send,出现粘包问题的更多相关文章
- python socket网络编程之粘包问题详解
一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- Python开发【socket篇】解决粘包
客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...
- socket基于TCP(粘包现象和处理)
目录 6socket套接字 7基于TCP协议的socket简单的网络通信 AF_UNIX AF_INET(应用最广泛的一个) 报错类型 单一 链接+循环通信 远程命令 9.tcp 实例:远程执行命令 ...
- python 网络编程 缓冲和粘包
tcp:属于长连接,与一个客户端进行连接了以后,其他的客户端要等待,要连接另外一个,必须优雅的断开前面这个客户端的连接. 允许地址重用:在bind IP地址和端口之前加上,# server.setso ...
- day8---多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- c# Socket通讯中关于粘包,半包的处理,加分割符
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using S ...
- 11.1、socket连接中的粘包、精确传输问题
粘包: 发生原因: 当调用send的时候,数据并不是即时发给客户端的.而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会发送,所以有时候发送太快的话,前一份数据还没有 ...
- day08 多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
随机推荐
- linux tomcat 启动报错 Cannot find /etc/bin/setclasspath.sh
这是由于tomcat/bin/catalina.sh文件中有一个设置变量的方法 $CATALINA_HOME 有的tomcat中需要默认此值 $CATALINA_HOME=tomcat地址
- mysql 数据包太小会引发错误信息
Error querying database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for quer ...
- JS frame 跨域 传值
1.在index.html 页面定义一个 函数用于接收 子页面的调用. <iframe id="common_iframe" class="common_conte ...
- hbase(0.94) get、scan源码分析
简介 本文是需要用到hbase timestamp性质时研究源码所写.内容有一定侧重.且个人理解不算深入,如有错误请不吝指出. 如何看源码 hbase依赖很重,没有独立的client包.所以目前如果在 ...
- [洛谷P3834] 【模板】可持久化线段树 1(主席树)
题目大意:静态区间第K小 题解:主席树 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #define maxn 2 ...
- 【BZOJ 2744 朋友圈】
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1570 Solved: 532[Submit][Status][Discuss] Descripti ...
- 插头dp题表
bzoj1814: Ural 1519 Formula 1 bzoj3125: CITY bzoj1210: [HNOI2004]邮递员 bzoj2331: [SCOI2011]地板 bzoj1187 ...
- 原生ajax方法封装
/** * @function ajax request * @fields ajaxName:请求名称,method:请求方法,headers:setRequestHeader自定义部分,url:接 ...
- Python代码规范
一:背景 用于规范化ocp python开发,对于使用python开发的程序使用统一的风格,便于代码的维护 二:python风格规范 分号:不要在行尾加分号,也不要用分号将两条命令放在同一行 括号:宁 ...
- iOS 快速框架搭建项目
项目目录 Pod第三方 gitHub地址 https://github.com/henusjj/Basic-project-framework
