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 ...
随机推荐
- hbase表的写入
hbase列式存储给我们画了一个很美好的大饼,好像有了它,很多问题都可以轻易解决.但在实际的使用过程当中,你会发现没有那么简单,至少一些通用的准则要遵守,还需要根据业务的实际特点进行集群的参数调整,不 ...
- tomcat 路径"/"表示根目录
- ES索引
Elasticsearch索引别名.Filtered索引别名.Template 在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活, ...
- [CF1019A]Elections
题目大意:有$n$个人,$m$个政党,每个人都想投一个政党,但可以用一定的钱让他选你想让他选的政党. 现在要$1$号政党获胜,获胜的条件是:票数严格大于其他所有政党.求最小代价 题解:暴力枚举其他政党 ...
- [codeforces] 17E Palisection
原题 题目要求相交的回文串对数,这显然非常难,但是要有一种正难则反的心态,求不出来相交的,求出来不相交的不就好了! 对于每以位置i结尾的字符串,在他后面与他不相交的就是以这个位置为结尾的个数和以这个位 ...
- HDU.2095(异或运算)
find your present (2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Fabric证书解析
一.证书目录解析 通过cryptogen生成所有证书文件后,以peerOrgannizations的第一个组织树org1为例,每个目录和对应文件的功能如下: ca: 存放组织的根证书和对应的私 ...
- POJ1062:昂贵的聘礼(dfs)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58108 Accepted: 17536 题目链接:http ...
- angular js module 的理解
module其实就是一个容器,里面可以装controller,service,directive,filter等, 官网的解释是:Module :A container for the differe ...
- Jquery Ajax异步上传
<script> $(function(){ $('#filephoto').change(function(imgFile){ console.log(imgFile) var file ...
