python socket send_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之间添加个一个交互

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统安装佳能打印机驱动,在ubuntu16.04 64-bit上安装佳能打印机驱动Linux_UFRII_PrinterDriver_V320_us_EN...

在ubuntu16.04 64-bit上安装佳能打印机驱动Linux_UFRII_PrinterDriver_V320_us_EN发布时间&#xff1a;2018-04-06 21:46,浏览次数&#xff1a;631, 标签&#xff1a;ubuntubitLinuxUFRIIPrinterDriverusEN1. 安装一些依赖项 (不确定它们是否都需要):sudo apt install libc6-i3…

python重复输入上面指令_stdin stdout python:如何重复使用同一输入文...

我对Python很陌生,对stdin stdout方法甚至更新.不过,我需要使我的脚本可用于UNIX命令,以便例如使用我的脚本一次处理2个输入文件.该脚本与命令行参数完美配合&#xff1a;newlist []def f1()....def f2(input_file):vol_id sys.argv[3]for line in input_file:if ... :line …

linux条件变量cond,Linux 条件变量 pthread_cond_signal及pthread_cond_wait

#include#include#include#includepthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;/*静态初始化*/pthread_cond_t cond PTHREAD_COND_INITIALIZER; //init condvoid *thread1(void*);void *thread2(void*);int i 1; //globalint main(int argc,char* argv[]){pthread_…

哈希查找

哈希查找之前&#xff0c;我们要弄清楚哈希技术&#xff0c;哈希技术是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f&#xff0c;使得每个关键字key对应一个存储位置f(key)。查找时&#xff0c;根据这个确定的对应关系找到给定值的映射f(key),若查找集合中存在这…

python两人一碰_python运用pygame库实现双人弹球小游戏

使用python pygame库实现一个双人弹球小游戏&#xff0c;两人分别控制一个左右移动的挡板用来拦截小球&#xff0c;小球会在两板间不停弹跳&#xff0c;拦截失败的一方输掉游戏&#xff0c;规则类似于简化版的乒乓球。因为是第一次用pygame写python小游戏并且只用了两三个小时&…

fedora 安装Linux源码,如何在 Fedora 29/30 上安装 VS Code

Visual Studio Code 简称 VS Code 是微软开发的一款跨平台的源代码编辑器。 它具有内置的调试支持&#xff0c;嵌入式 Git 控件&#xff0c;语法突出显示&#xff0c;代码完成&#xff0c;代码重构和代码片段。Visual Studio Marketplace 提供了许多插件和扩展来扩展VS代码的功…

2016-1-31

按照我之前的计划&#xff0c;应该是今天晚上才到家呢&#xff0c;可是21号就已经来到了&#xff0c;在家已经整整10天了&#xff0c;22号放纵了一天&#xff0c;有一天和CY出去溜了&#xff0c;所以应该是整整8天的时间是可以利用的&#xff0c;然而&#xff0c;我发现效果并不…

三菱伺服驱动器说明书_张家港市HG-KN13J-S100三菱伺服控制器

张家港市HG-KN13J-S100三菱伺服控制器MR-J2S1该产品还有RS-232和RS-422串行通讯功能&#xff0c;通过安装有伺服设置软件的个人计算机就能进行参数设定&#xff0c;试运行&#xff0c;状态显示和增益调整等操作。2与MR-J2S系列配套的伺服电机编码器采用了分辨率为131072脉冲/转…

linux中shell编写数组排序,linux bash shell实现对数组快速排序(升序)

2011年12月19日&#xff0c;参考网上用C语言实现的快速排序&#xff0c;经过一番修改后&#xff0c;用shell(我的测试环境为centos5的bash-v3.x)实现了相同功能&#xff1a;对数组进行升序排序。注&#xff1a;如果代码框里的代码复制出来后显示异常&#xff0c;就麻烦下载附件…

python接口自动化测试框架实战从设计到开发_Python接口自动化测试框架实战 从设计到开发...

第1章 课程介绍(不要错过)本章主要讲解课程的详细安排、课程学习要求、课程面向用户等&#xff0c;让大家很直观的对课程有整体认知&#xff01;第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的http\https请求包、如何模拟请求数据、过滤规则及修改响应数据、如何…

搭建 局域网

配件&#xff1a;网络交换机tp-link TL-SF1016D 16口&#xff08;预备继续添加主机&#xff09;&#xff1b;vk-qf9700 USB网卡&#xff08;10元一个&#xff09;&#xff1b;非屏蔽5类双绞线&#xff1b;机器都是win7的主机&#xff08;三台分别是 8&#xff0c;9,10&#xff…

Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法

许多win10系统用户会在电脑中安装ssd固态硬盘&#xff0c;而在使用过程中经常会出现卡顿的情况&#xff0c;检查之后发现磁盘占用率100%&#xff0c;这是怎么回事呢&#xff0c;那么其实我们可以通过禁用MSI模式来解决&#xff0c;接下来给大家讲解一下通过禁用MSI模式解决Win1…

oracle jdbc jar包_Oracle总结之plsql编程(基础七)

紧接基础六&#xff0c;对oracle角色和权限的管理之后&#xff0c;在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结&#xff0c;和大家分享&#xff01;一、plsql块1、只包括执行部分的plsql块打开输出选项&#xff1a;set serveroutput on&#xff1b;b…

Visual Studio调试之断点基础篇

原文链接地址&#xff1a;http://www.cnblogs.com/killmyday/archive/2009/09/26/1574311.html 我曾经问过很多人&#xff0c;你一般是怎么调试你的程序的&#xff1f; F9, F5, F11, F…… 有很多书和文章都是介绍怎么使用Visual Studio编写WinForm啦,、ASP.NET之类的程序&…

无线 在linux叫什么地方,请问有知道atheros无线网卡Linux驱动官方下载地址是什么吗?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼上的没给出中文翻译&#xff0c;屮把它翻译下&#xff0c;以让中文用户读起来更友好些&#xff1a;1.Download board-2.bin and firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1下载---兵文件 board-2.bin 和 firmware-4.bin_WLAN…

python cv.imread_Python的OpenCV cv2.imread总是返回None而cvFeatDetector崩溃了python

我用python中的opencv弄湿了自己的脚&#xff0c;并且我认为开始加载图像是一个很好的开始。我在我的系统上构建了opencv&#xff0c;并且在目录tpl / opencv中有python绑定和opencv dll&#xff0c;这与我的项目相关。以下是一些演示问题的代码&#xff1a;from tpl.opencv im…

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件&#xff0c;我们会创建一个名称以 Application_ 开头&#xff0c;以事件名称结尾的方法&#xff0c;比如 Application_BeginRequest。举个例子&#xff0c;就像 Application_Start 和 Application_End 方法&a…

micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖

本帖最后由 michael_llh 于 2019-4-17 10:06 编辑更下项目的进程哈&#xff01;项目的思路很简单&#xff0c;就是从网上获取天气信息&#xff0c;然后进行显示&#xff01;很尽量把过程写清楚&#xff0c;方便大家的交流和学习。首先说明下使用的硬件信息&#xff1a;Micropyt…

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对Shell 循环语句的for循环进行了介绍&#xff0c;本篇给大家介绍下Shell 中另一种循环语句&#xff1a;Shell while循环。在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对…

存储过程优缺点总结

优点&#xff1a; 1、快速 a、当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时&#xff09;&#xff0c;可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作&#xff0c;如果用程序来完成&#xff0c;就变成了一条条的 SQ…