缓冲区 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" ...
随机推荐
- 打return
var zz=xx(); alert(zz); zz=yy(); alert(zz); function xx(){ var i=1,j=2; return i+j; } function yy(){ ...
- react中对于context的理解
一.context旧版的基本使用 1.context的理解 当不想在组件树中通过逐层传递props或state的方式来传递数据时,可使用context来实现跨层级的组件数据传递. 2.context的 ...
- vue-cli3.0+node.js+axios跨域请求session不一样的问题
一.问题重述 使用的是,前后端分离,前端vue+axios请求,后端使用node搭建服务端接口,遇到的问题是,我通过登录接口吧数据存储型在session,我登录上以后,发现再次验证登录(另一个接口)的 ...
- SSM项目思路整合NEW2
上接于 https://www.cnblogs.com/shijinglu2018/p/10374541.html ...... 三)客户管理模块开发 说明:其实大致思路差不太多,都是首先根据前端页面 ...
- php 使用代理IP进行数据抓取
什么是代理?什么情况下会用到代理IP?代理服务器(Proxy Server),其功能就是代用户去取得网络信息,然后返回给用户.形象的说:它是网络信息的中转站.通过代理IP访问目标站,可以隐藏用户的真实 ...
- PHP 农历公历互转,八字排盘,星座,日历,支持从-1000到3000年间的排盘,二十四节气
<?php /** * @author szargv@wo.cn * * 此日历转换类完全源于以下项目,感谢这两个项目作者的无私分享: * https://github.com/nozomi19 ...
- SpringBoot后台接收前台的字符串数据
需求 将前台传入的字符串数据转为int类型. 操作 在pom.xml中添加引用. <dependency> <groupId>org.apache.commons</gr ...
- python程序—名片管理系统
创建一个名片管理系统,实现增.删.改.查.四项功能 listcard = [] while True: print('**********欢迎来到名片管理系统**********') print(' ...
- 防cc攻击策略
黑客攻击你的网站,会采取各种各样的手段,其中为了降低你网站的访问速度,甚至让你的服务器瘫痪,它会不断的刷新你的网站,或者模拟很多用户同一时间大量的访问你的网站, 这就是所谓的CC攻击,这就需要我们在程 ...
- 小程序之 fixed定位下scroll-view左右滚动失效
红框为悬浮 左右可以滑动 效果如下⬇️ 悬浮把最外层position:fixed;top:0;这个时候上面的导航就可以悬浮 但是会出现左右滑动不了的情况 这是因为我没给设置宽度 这个时候我们把包着sc ...