补充subprocess模块和粘包现象及解决办法是什么-成都快上网建站

补充subprocess模块和粘包现象及解决办法是什么

这期内容当中小编将会给大家带来有关补充subprocess模块和粘包现象及解决办法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联主营殷都网站建设的网络公司,主营网站建设方案,app软件开发,殷都h5成都微信小程序搭建,殷都网站营销推广欢迎殷都等地区企业咨询

远程执行命令,补充subprocess模块,粘包现象及解决办法

1.subprocess模块

shell参数:

如果把shell设置成True,指定的命令会在shell里解释执行。

subprocess.PIPE

一个可以被用于Popen的stdin 、stdout 和stderr 3个参数的特输值,表示需要创建一个新的管道。

例:

#author: wylkjj

#date:2019/4/18

import subprocess

# b=subprocess.Popen('dir',shell=True)

# print(b)

#stdout=subprocess.PIPE把子进程封装到a里面去了

a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)

# print(a)#多进程,子进程,父进程同时进行,谁快谁先打印

print(str(a.stdout.read(),'gbk'))#把执行结果从子进程里面取出来

2.远程执行命令

#author: wylkjj

#date:2019/4/18

#服务端

import subprocess

import socket

sk=socket.socket()

address=('127.0.0.1',8000)

sk.bind(address)

sk.listen(2)

print('waiting')

while 1:

conn,addr=sk.accept()

print(addr)

while 1:

data=conn.recv(4024)

print('......'+str(data, 'utf8'))

if not data:break

obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

cmd_result = obj.stdout.read()

# 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型

result_len=bytes(str(len(cmd_result)),'utf8')

conn.sendall(result_len)

conn.send(cmd_result)

sk.close()

#author: wylkjj

#date:2019/4/18

#客户端

import subprocess

import socket

sk=socket.socket()

address=('127.0.0.1',8000)

sk.connect(address)

while True:

inp = input('>>>')

if inp=='exit':

break

sk.send(bytes(inp,'utf8'))

result_len=int(str(sk.recv(1024),'utf8'))

print(result_len)

# 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收

data = bytes()

while len(data) != result_len: #判断data的长度是否与server端传来的长度相符

recv = sk.recv(1024)

data += recv

print(str(data,'gbk'))

sk.close()

3.粘包现象及解决办法

#author: wylkjj

#date:2019/4/18

#服务端

import subprocess

import socket

sk=socket.socket()

address=('127.0.0.1',8000)

sk.bind(address)

sk.listen(2)

print('waiting')

while 1:

conn,addr=sk.accept()

print(addr)

while 1:

data=conn.recv(4024)

print('......'+str(data, 'utf8'))

if not data:break郑州人流价格 http://www.zzzykdfk.com/

obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

cmd_result = obj.stdout.read()

# 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型

result_len=bytes(str(len(cmd_result)),'utf8')

conn.sendall(result_len)

conn.recv(1024) #因为两个sand连一起发送会出现粘包现象,所以recv一下(利用recv的阻塞原理)

conn.send(cmd_result)

sk.close()

#author: wylkjj

#date:2019/4/18

#客户端

import subprocess

import socket

sk=socket.socket()

address=('127.0.0.1',8000)

sk.connect(address)

while True:

inp = input('>>>')

if inp=='exit':

break

sk.send(bytes(inp,'utf8'))

result_len=int(str(sk.recv(1024),'utf8'))

sk.sendall("ok")

print(result_len)

# 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收

data = bytes()

while len(data) != result_len: #判断data的长度是否与server端传来的长度相符

recv = sk.recv(1024)

data += recv

print(str(data,'gbk'))

sk.close()

上述就是小编为大家分享的补充subprocess模块和粘包现象及解决办法是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


名称栏目:补充subprocess模块和粘包现象及解决办法是什么
本文地址:http://kswjz.com/article/jsiigh.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流