python_day26__socke网络编程之subprocess方法_产生在DOS环境下执行的子进程以执行DOS命令符

  压力大,那就慢慢来吧,一件事一件事的去做,累了就休息,心态最重要~~~(梳理一下最近的任务:软著、专利、python、数字信号英文综述、数字信号作业实验报告
统计学作业、数字图像处理四节课重点整理),时间会把这一件件事情给抹去的。


#Author:'haijing'

#date:2018/11/8

#服务端:在别人的哪里
#必须线开启server端
#此代码可以执行在客户端输入的dos环境下的命令,并在客户端返回执行的命令的结果

import socket #socket是一个接口 内部封装了有关ip地址和端口号的信息 并且创建ip和端口号
import subprocess #下面目前就使用一个类Popen,让代码在dos环境下运行

sk = socket.socket() #创建一个socket对象s 服务端的sk对象和客户端的sk对象完全是不一样的
address = ('127.0.0.1',8000) #设置一个元组,元组内放的是ip和端口号:8000
sk.bind(address) #绑定ip和端口号,bind方法后跟的必须是一个元组
sk.listen(3) #3表示服务端最多和三个客户端同时建立通信,但是传送信息的话只能是一个一个的来
print('waiting...')
conn,addr = sk.accept() #客户端开启之后就一直在这里等待着

while 1:
#min收
try: #如果try下的语句出错,那么就去执行except中的语句
data_recv = conn.recv(1024) #接收客户端发送过来的dos环境下的命令,1024为接收命令的长度
data_recv = str(data_recv,'utf8') #命令转换为字符串的形式
except:
conn, addr = sk.accept() # 重新去接收另外的一个客户端的ip
data_recv = conn.recv(1024) #接收客户端发送过来的dos环境下的命令
data_recv = str(data_recv, 'utf8') #命令转换为字符串的形式
# if not data: break #如果接收到对方发是空子节,那么同时结束对话
if not data_recv:
conn, addr = sk.accept() #如果对方退出了,则server端可以在这里另外接受新的网友
continue #继续去判断while循环的条件是否成立
print(data_recv) #打印接收的dos命令

#min发送数据长度
#Popen为一个类 下一句为创建obj对象stout为标准输出,PIPE为管道,
#加上stdout=subprocess.PIPE这一句后,将subprocess.Popen(data,shell=True)的信息全都封装到obj中去,而不在屏幕中显示
# obj = subprocess.Popen(data, shell=True)会打印obj这个对象的内容
obj = subprocess.Popen(data_recv,shell=True,stdout=subprocess.PIPE)#data_recv(注意data_recv为字符串格式)为要执行的命令,shell和stdout为参数
cmd_result = obj.stdout.read() #通过这一句就可以将obj中封装的信息(子进程中的执行结果信息)读出来,二进制类型

result_len = len(cmd_result) #取出cmd_result的长度,result_len是一个int整形
result_len = str(result_len) #int类型和bytes类型不可直接转换,故先转成str形 *****
result_len = bytes(result_len,'utf8') #传数据的话只能传bytes类型,所以这里进行一个转换

conn.sendall(result_len) #先发送一个数据的长度,等待对方接收,如果没接收,那么就一直停在这里

#min再次发送数据
conn.sendall(cmd_result) #将dos环境下执行的结果发送出去,因为cmd_result是dos环境下利用电脑自带的编码方式进行自动编码的,此电脑编码方式是gbk
#所以在cmd_client端下解码要用gbk解码方式

#Author:'haijing'
#date:2018/11/8

#客户端
#必须线开启server端
#此代码可以执行在客户端输入的dos环境下的命令,并在客户端返回执行的命令的结果

import socket

sk = socket.socket() #创建socket对象 服务端的sk对象和客户端的sk对象完全是不一样的
address = ('127.0.0.1',8000) #设置元组 里面放的是需要连接的服务器的ip地址
sk.connect(address) #连接ip地址为127.0.0.1的服务端

while 1:
#jing发 不能发空,否则对方会停在阻塞的状态
inp_jing = input('>>>') #输入一个dos命令
if inp_jing == 'exit': #如果输入exit,那么聊天终止,但是还是会给对方放inp_haijing这一条消息的
break
inp_jing = bytes(inp_jing,'utf8')
sk.sendall(inp_jing) #如果字节很多的话,send()可能发不完,但是sendall可以发完的

#jing收数据长度
result_len = sk.recv(1024) #result_len为bytes类型,即这个数字是bytes型的
result_len = str(result_len,'utf8') #由于bytes不能直接转换成int型,先转成str型的,由于在cmd_server端是用utf8编码的,所以这里也要用utf8解码
result_len = int(result_len) #此时result_len就是int型了
print(result_len)

#jing收数据
data = bytes() #新建一个空的bytes类型的变量data
while len(data) != result_len: #如果data_recv的长度不等于上一次接收的数据的长度,那么就一直去接收
data_recv = sk.recv(1024)
data += data_recv #将前几次接收的bytes类型的数据data_recv累加起来 *****
print(str(data,'gbk')) #因为cmd_result是dos环境下利用电脑自带的编码方式进行自动编码的,此电脑编码方式是gbk,所以在这里解码要用gbk解码方式


sk.close #关的此客户端是和服务端之间的通信通道,同样server端也是有关掉通信通道的能力,但是server端一般是不会关的

haijing in HZ 阴天 有点冷了,不过实验室有空调的

2018.11.08 傍晚



























原文地址:https://www.cnblogs.com/YiYA-blog/p/9931206.html