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 ...
随机推荐
- java中bug调试
根据打印异常位置,定位异常代码,判断有无低级错误,直接更改 否则判断有无相似代码,其他代码和异常代码的区别对比 给内层代码打断点,跟踪异常位置
- Bootstrap中的Affix插件
我们为什么要用bootstrap?因为懒!哦....不,是因为方便,呃...意思差不多. 今天来说说Affix这个插件,它可以使导航栏固定,免去了自己手写的麻烦,用着非常方便,废话不多说,下面是用法. ...
- 【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理
题目描述 求 $g^{\sum\limits_{k|n}C_{n}^{\frac nk}}\mod 999911659$ 输入 有且仅有一行:两个数N.G,用一个空格分开. 输出 有且仅有一行:一个 ...
- 【题解】HNOI2018寻宝游戏
太厉害啦……感觉看到了正解之后整个人都惊呆了一样.真的很强%%% 首先要注意到一个性质.位运算列与列之间是不会相互影响的,那么我们先观察使一列满足条件的操作序列需要满足什么条件.&0时,不论之 ...
- [bzoj3886] [USACO15JAN]电影移动Moovie Mooving
题目链接 状压\(dp\). 注意到\(n\leq 20\)且每个只能用一次,所以很显然可以压缩每部电影看过没,记\(f[sta]\)为状态为\(sta\)时最多可以看多久. 转移时先枚举状态,然后枚 ...
- 【BZOJ 1082】[SCOI2005]栅栏 二分+dfs
对于最优解我们发现所有的最优解都可以是前多少多少个,那么我们就二分这个前多少多少个,然后用dfs去判解,我们发现在dfs的过程中如果不剪枝几乎必T,所以我们就需要一些有效的剪枝 I. 我们在枚举过程中 ...
- MySQL使用笔记(三)表的操作
By francis_hao Dec 11,2016 表的操作 表的操作有创建表.查看表.删除表和修改表 创建表 创建表之前要在某个数据库中. mysql> create table ta ...
- [bzoj 2733]启发式合并权值线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 平衡树待学习.从一个博客学到了合并权值线段树的姿势:http://blog.csdn ...
- ng父组件调用子组件的方法
https://www.pocketdigi.com/20170204/1556.html 组件之间方法的调用统一用中间人调用.数据传递直接input和output即可
- eclipse集成mybatis的generater插件
mybatis也能方向生成代码,能方向生成实体类(po).mapper接口和Mapper接口映射文件,能减少我们代码的工作量.详细步骤如下 1.下载mybatis生成架包工具MyBatis_Gener ...
