使用网上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,出现粘包问题的更多相关文章

  1. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

  2. python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  3. Python开发【socket篇】解决粘包

    客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...

  4. socket基于TCP(粘包现象和处理)

    目录 6socket套接字 7基于TCP协议的socket简单的网络通信 AF_UNIX AF_INET(应用最广泛的一个) 报错类型 单一 链接+循环通信 远程命令 9.tcp 实例:远程执行命令 ...

  5. python 网络编程 缓冲和粘包

    tcp:属于长连接,与一个客户端进行连接了以后,其他的客户端要等待,要连接另外一个,必须优雅的断开前面这个客户端的连接. 允许地址重用:在bind IP地址和端口之前加上,# server.setso ...

  6. day8---多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

  7. c# Socket通讯中关于粘包,半包的处理,加分割符

    using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using S ...

  8. 11.1、socket连接中的粘包、精确传输问题

    粘包: 发生原因: 当调用send的时候,数据并不是即时发给客户端的.而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会发送,所以有时候发送太快的话,前一份数据还没有 ...

  9. day08 多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

随机推荐

  1. [洛谷P2604][ZJOI2010]网络扩容

    题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...

  2. BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP

    题目: 求仙人掌直径 http://www.lydsy.com/JudgeOnline/problem.php?id=1023 题解: 首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图 我 ...

  3. 《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  4. 【ZJ选讲·调整】

    给出n个点,m条有向边(带正权),起点S,终点T.(n<=2000,m<=30000) 再给出一个k,表示可以把最多k条边的权值调整为任意非负整数.(k<=100) 问是否可以通 ...

  5. 湖南大学第十四届ACM程序设计新生杯 Dandan's lunch

    Dandan's lunch Description: As everyone knows, there are now n people participating in the competiti ...

  6. 安卓titlebar的组合控件使用

    http://blog.csdn.net/itachi85/article/details/51435187

  7. bzoj 2566 calc 拉格朗日插值

    calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 377  Solved: 226[Submit][Status][Discuss] Descr ...

  8. (转)详解HTML网页源码的charset格式

    关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释 crifan http://www.crifan.com/summary_expl ...

  9. NodeJS概述

    NodeJS中文API 一.概述 Node.js 是一种建立在Google Chrome’s v8 engine上的 non-blocking (非阻塞), event-driven (基于事件的) ...

  10. HDU2571--命运---DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2571 #include "iostream" #include "cstdio&q ...