缓冲区 subprocess 黏包
import subprocess sub_obj = subprocess.Popen(
'dir', # 系统指令:'dir','ipconfig'.等
shell=True, # 使用shell,就相当于使用cmd窗口
stdout=subprocess.PIPE, # 标准输出PIPE管道,保存着指令的执行结果
stderr=subprocess.PIPE # 标准错误输出
)
print('正确输出',sub_obj.stdout.read().decode('gbk'))
print('错误输出',sub_obj.stderr.read().decode('gbk'))
from socket import *
ip_port=('127.0.0.1',8080) tcp_socket_server=socket(AF_INET,SOCK_STREAM)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(5)
conn, addr = tcp_socket_server.accept()
# 服务端连续接受两个信息
data1 = conn.recv(10)
data2 = conn.recv(10) print('----->',data1.decode('utf-8'))
print('----->',data2.decode('utf-8')) conn.close
nian_server01.py
import socket
BUFSIZE=1024
ip_port=('127.0.0.1',8080)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
res=s.connect(ip_port) s.send('hello'.encode('utf-8'))
s.send('sigui'.encode('utf-8'))
nian_client01.py
结果:
-----> hellosigui
----->
import socket
import subprocess
server = socket.socket()
ip_port = ('127.0.0.1',8010)
server.bind(ip_port)
server.listen()
conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024)
print(from_client_cmd.decode('utf-8'))
sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
std_msg = sub_obj.stdout.read()
print('指令执行的长度>>>',len(std_msg))
conn.send(std_msg)
nian_server02.py
import socket client = socket.socket()
client.connect(('127.0.0.1',8010)) while 1:
cmd = input('请输入指令:')
client.send(cmd.encode('utf-8'))
server_cmd_result = client.recv(1025)
print(server_cmd_result.decode('gbk'))
nian_client02.py
import socket
import subprocess
# 创建socket对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 地址重用
# 设置IP地址和端口号
ip_port = ('127.0.0.1',8080)
# 绑定IP地址和端口号
server.bind(ip_port)
# 监听IP地址和端口号
server.listen()
# 等待建立连接,conn是连接通道,addr是客户端地址
conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024)
print(from_client_cmd.decode('utf-8'))
# 接收到客户端发送的指令,服务端通过subprocess模块到服务器自己的系统执行这条指令
sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# 从管道中拿出结果,通过subprocess.Popen的实例化对象.stdout.read()方法来获取管道中的结果
std_msg = sub_obj.stdout.read()
# 为了解决黏包的现象,我们统计了一下消息的长度,先将消息长度发给客户端,客户端通过这个长度来接收后面服务端要发送的真实数据
std_msg_len = len(std_msg)
# 首先将数据长度的数据类型转化为bytes类型
std_bytes_len = str(len(std_msg)).encode('utf-8')
print('指令的执行结果长度>>>',len(std_msg))
conn.send(std_bytes_len) status = conn.recv(1024)
if status.decode('utf-8') == 'ok':
conn.send(std_msg)
else:
pass
solve_server01.py
import socket client = socket.socket()
client.connect(('127.0.0.1',8080)) while 1:
cmd = input('请输入指令:')
client.send(cmd.encode('utf-8'))
server_res_len = client.recv(1024).decode('utf-8')
print('来自服务端的消息长度:',server_res_len)
client.send(b'ok')
server_cmd_result = client.recv(int(server_res_len))
print(server_cmd_result.decode('gbk'))
solve_client01.py
import struct num = 100 # num太大的话会报错,
# struct.error: 'i' format requires -2147483648 <= number <= 2147483647 #这个是范围
# 打包,将int类型的数据打包成4个长度的bytes类型的数据
byt = struct.pack('i',num)
print(byt)
# 解包,将bytes类型的数据,转换为对应的那个int类型的数据
# 注:unpack返回的是truple
int_num = struct.unpack('i',byt)[0]
print(int_num)
import socket
import subprocess
import struct server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 地址重用
ip_port = ('127.0.0.1',8090) server.bind(ip_port)
server.listen()
conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8'))
# 接收到客户端发送来的系统指令,服务端通过subprocess模块到服务端自己的系统里只能怪这条指令
sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE, # 正确的结果存放位置
stderr=subprocess.PIPE # 错误结果的存放位置
)
# 从管道中拿出结果,通过subproess.Popen的实例化对象.stdout.read()方法来获取管道中的结果
std_msg = sub_obj.stdout.read()
# 为了解决黏包的现象,首先统计一下消息的长度,先将消息的长度发给客户端,客户端铜鼓这个长度来接收后面服务端发送的真实数据
std_msg_len = len(std_msg)
print('指令的执行长度>>>',len(std_msg))
msg_lenint_struct = struct.pack('i',std_msg_len)
conn.send(msg_lenint_struct+std_msg)
solve_server01.py
import socket
import struct
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8090)) while 1:
cmd = input('请输入指令:')
# 发送指令
client.send(cmd.encode('utf-8'))
# 接收数据长度,首先接收4个字节长度的数据,因为这四个字节是后面数据的长度
server_res_len = client.recv(4)
msg_len = struct.unpack('i',server_res_len)[0] print('来自服务端的消息长度',msg_len)
# 通过解包出来的长度,来接收后面的真实数据
server_cmd_result = client.recv(msg_len)
print(server_cmd_result.decode('gbk'))
solve_client02.py
缓冲区 subprocess 黏包的更多相关文章
- 缓冲区 subprocess 黏包 黏包的解决方案
缓冲区: 将程序和网络解耦输入缓冲区输出缓冲区 print('>>>>', server.getsockopt(SOL_SOCKET, SO_SNDBUF)) 查看输出缓冲区大 ...
- python 缓冲区 subprocess 黏包 黏包解决方案
一.缓冲区 二.两种黏包现象 两种黏包现象: 1 连续的小包可能会被优化算法给组合到一起进行发送 黏包现象1客户端 import socket BUFSIZE = 1024 ip_prort = (' ...
- 网络编程3 网络编程之缓冲区&subprocess&粘包&粘包解决方案
1.sub简单使用 2.粘包现象(1) 3.粘包现象(2) 4.粘包现象解决方案 5.struct学习 6.粘包现象升级版解决方案 7.打印进度条
- 模拟ssh、黏包、hashlib模块
一.模拟ssh 1.subprocess模块 ipconfig -all dir subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system ...
- 黏包的原理 (tcp udp) struct模块
黏包 指数据混乱问题(发送端发送数据,接收端不知如何去接收) 只有tcp协议才会发送粘包,udp不会发生 黏包(tcp) 有一个合包机制(nagle算法),将多次连续发送且间隔较小的数据,进行打包成一 ...
- day28 1.缓冲区 2.subprocess 3.黏包现象 4.黏包现象解决方案 5.struct
1.缓冲区: 输入缓冲区 输出缓冲区 2. subprocess的使用import subprocess sub_obj = subprocess.Popen('ls', #系统指令shell=Tr ...
- python之路--subprocess,粘包现象与解决办法,缓冲区
一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...
- day 28 黏包 ssh模块 subprocess模块
套接字的信仰 一切皆文件 昨日作业: import socket sock=socket.socket() # TCP协议 IP_PORT=("127.0.0.1",8899) s ...
- subprocess、struct模块的简单应用与ssh模型(黏包)
一.subprocess模块 #可以通过传递字符串命令,帮你去实现一些操作系统的命令. import subprocess res = subprocess.Popen("dir" ...
随机推荐
- Linux Spi驱动移植小结
2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1, make menuconfig添加 ...
- GO map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 语法:map[KeyType]ValueType KeyType:表示键的类型. V ...
- Java运行环境
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java Cloud Studio ...
- 2019MABU3月班——SAP导入总账科目小笔记
1. 在目录中找到“集中” 2.总账科目这里输入代码,公司代码为3000 3. 点“创建” 4. 然后可以填下面这些了 5. 转到“创建/银行/利息” 6. 选字段状态组 7. 保存 8.大功告成.
- vue 异步刷新页面,
入口文件vue.app中 <div id="app"> <router-view v-if="isRouterAlive" /> < ...
- mysql和oracle分页查询
MYSQL分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实现分 ...
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- elasticsearch+logstash_jdbc 实现mysql数据实时同步至es
jdk安装1.8版本,es.ls.ik.kibana版本一致我这里使用的6.6.2版本 安装es tar xf elasticsearch-6.6.2.tar.gz mv elasticsearch- ...
- mac pycharm快捷键
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- 【Django模板006】
在前面的几节中我们都是用简单的django.HttpResponse来把内容显示到网页上,本节将讲解如何使用渲染模板的方法来显示内容. 1.创建一个zqxt_tmpl项目,和一个名称为learn的应用 ...