python(39)- 网络编程socket练习

基于tcp的套接字实现远程执行命令的操作

#服务端

import socket
import subprocess
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port=("127.0.0.1",8080)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(ip_port)
phone.listen(5)

while True:
    conn,addr=phone.accept()
    print(addr)
    while True:
        try:
            cmd=conn.recv(1024)
            res=subprocess.Popen(cmd.decode("utf8"),
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)

#注释掉的这么多行,是因为在linux系统下同时执行多条命令,命令中如果有对有错的话res.stderr.read()和res.stdout.read()都会有返回值。
            #err=res.stderr.read()        
            #if err:
            #   cmd_res=err
            #else:
            #    cmd_res=res.stdout.read()
            #conn.send(cmd_res)
#修改为:
            conn.send(res.stdout.read())
            conn.send(res.stderr.read())

        except Exception:
            break
    conn.close()
phone.close()
#客户端

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("192.168.85.129",8080))
while True:
    cmd=input(">>:").strip()
    if not cmd:continue
    phone.send(cmd.encode("utf8"))
    data=phone.recv(8192)        #当命令行打印的东西太长时,接收超过1024,所以这里修改为8192
    print(data.decode("utf8"))        #当服务端运行在linux系统下,为utf8;服务端在windows下运行时,为gbk

phone.close()

当服务端运行在Windows系统下,若客户端发送给服务端识别window系统的命令,服务端将执行windows系统命令的结果发送给客户端显示,不能识别的则发送错误信息给客户端。

同样当服务端在linux系统下运行,若客户端发送给服务端识别linux系统的命令,服务端将执行windows系统命令的结果发送给客户端显示,不能识别的则发送错误信息给客户端。

原文地址:https://www.cnblogs.com/xuyaping/p/6803732.html