码迷,mamicode.com
首页 > 其他好文 > 详细

模块介绍

时间:2018-11-28 20:28:22      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:data   desktop   读写   use   read   代码   tcpip   数据   pip   

subprocess模块

它是可以远程操作主机,模拟shell命令

‘dir‘是windows上查看任务的命令  

import subprocess
obj = subprocess.Popen(dir, shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
#Popen是模拟cmd命令,‘dir‘是windows上查看任务的命令,shell=True是指可以用shell命令了, 输出和错误,放到管道(PIPE)里
# print(obj.stdout.read().decode(‘gbk‘)) #打印输出的内容
# print(obj.stderr.read().decode(‘gbk‘)) #打印错误的内容
res = obj.stdout.read() + obj.stderr.read() #错误和输入放到一起给变量res
print(res.decode(gbk)) #打印res

在linux里可以创建python脚本,写入

import subprocess
obj = subprocess.Popen(ls;lsblk, shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
#Popen是模拟cmd命令,‘dir‘是windows上查看任务的命令,shell=True是指可以用shell命令了, 输出和错误,放到管道(PIPE)里
# print(obj.stdout.read().decode(‘utf-8‘)) #打印输出的内容
# print(obj.stderr.read().decode(‘utf-8‘)) #打印错误的内容
res = obj.stdout.read() + obj.stderr.read() #错误和输入放到一起给变量res
print(res.decode(utf-8)) #打印res

 socket模块

服务端步骤:

1、socket创建一个套接字

2、bind绑定ip和port

3、listen使套接字变为可以被动连接

4、accept等待客户端的连接

5、recv/send接收发送数据

import socket #导入模块
server = socket.socket()#创建实例,传给server,默认TCPIP ipv4
server.bind((0.0.0.0, 8888))#0000代表暴露所有IP,或者冒号里边空着,也可以输入指定IP
server.listen(5)#监听最大5个链接
print(等待电话。。。)
conn, addr = server.accept()#链接和addr需要分别赋值,等待客户端连接,没有链接就等待
print(电话来了。。。)
#服务器接收消息
data = conn.recv(1024) #接收消息,大小为1024
print(data.decode(utf-8))
#服务器发送消息
nfo = input(===>:)
conn.send(info.encode(utf-8))

客户端步骤:

1、创建套接字

2、连接服务器

3、发送数据,最大接收1024字节

4、关闭套接字

import socket
client = socket.socket()
client.connect((localhost, 8888))#如果是远程链接要写IP
#客户发送消息
info = input(===>:)
client.send(info.encode(utf-8))
#客户接收消息
data = client.recv(1024)
print(data.decode(utf-8))

先运行客户端,进入等待链接,然后运行服务端链接,输入聊天内容,回车发送,切换到客户端,回复收到的消息,这样就完成了聊天的过程,但是一人说一句后,我们看到程序结束了,那我们没聊够怎么办,对,加个循环。

我们在“服务器接收消息”和“客户端发送消息”之前加入while True:

并且下方整体缩进。

import socket #导入模块
server = socket.socket()#创建实例,传给server,默认TCPIP ipv4
server.bind((0.0.0.0, 8888))#0000代表暴露所有IP,或者冒号里边空着,也可以输入指定IP
server.listen(5)#监听最大5个链接
print(等待电话。。。)
conn, addr = server.accept()#链接和addr需要分别赋值,等待客户端连接,没有链接就等待
print(电话来了。。。)
#服务器接收消息
while True:
    data = conn.recv(1024) #接收消息,大小为1024
    print(data.decode(utf-8))
    #服务器发送消息
    info = input(===>:)
    conn.send(info.encode(utf-8))
import socket
client = socket.socket()
client.connect((localhost, 8888))#如果是远程链接要写IP
#客户发送消息
while True:
    info = input(===>:)
    client.send(info.encode(utf-8))
    #客户接收消息
    data = client.recv(1024)
    print(data.decode(utf-8))

这样我们就可以尽情的发送消息了

 技术分享图片技术分享图片

不过,当我们什么也不输入那么,会发现程序卡住了,再输入的内容(酷酷酷酷酷),也无法发送了,针对此,我们再原代码的基础上,客户端和服务端的发送条件加入为空循环

技术分享图片技术分享图片

那么运行后,输入为空回车,将会重新上输入

 技术分享图片

这个时候我们发现,客户端没有发消息的话,那么服务端将一直等待,无法发送,整个程序处在半双工的情况下,所以我们要改成全双工,可以自由发送,那么就需要创建函数进程了

服务端:

import socket 
import threading
server = socket.socket()
server.bind((0.0.0.0, 8888))
server.listen(5)
print(等待电话。。。)
conn, addr = server.accept()
print(电话来了。。。)
def recv():
    while True:
        # 服务器接收消息
        data = conn.recv(1024) 
        print(data.decode(utf-8))
def send():
    while True:
        # 服务器发送消息
        info = input(===>:)
        if not info:continue
        conn.send(info.encode(utf-8))
t1 = threading.Thread(target=recv)
t2 = threading.Thread(target=send)
t1.start()
t2.start()

客户端:

import socket
import threading
client = socket.socket()
client.connect((localhost, 8888))
def send():
    while True:
        # 客户发送消息
        info = input(===>:)
        if not info:continue
        client.send(info.encode(utf-8))
def recv():
    while True:
        #客户接收消息
        data = client.recv(1024)
        print(data.decode(utf-8))

t1 = threading.Thread(target=send)
t2 = threading.Thread(target=recv)
t1.start()
t2.start()

到此,一个聊天程序就基本成型了

技术分享图片技术分享图片

进阶修炼:链接Linux,模拟远程控制

import socket
import subprocess
import threading
server = socket.socket()
server.bind((‘‘, 8888))
server.listen(5)
print(等待电话.....)
conn, addr = server.accept()
print(电话来了......)
while True:
    data = conn.recv(10240)
    cmd = subprocess.Popen(data.decode(utf-8),
                           shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
    stdout = cmd.stdout.read()
    stderr = cmd.stderr.read()
    conn.send(stdout + stderr)

链接成功后,客户端输入的命令,可以得到相应的反馈结果 

如:输入ls -l

技术分享图片

 例:通过读写复制文件

with open(r?C:\Users\逸轩\Desktop\w.txt‘, rb)as f:#二进制读
    data = f.read()
with open(ra.txt, wb)as f:#二进制写
    f.write(data)

 

模块介绍

标签:data   desktop   读写   use   read   代码   tcpip   数据   pip   

原文地址:https://www.cnblogs.com/liketimes/p/10028832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!