首页 > 其他 > 详细

网络编程[第三篇]基于tcp协议实现远程连接

时间:2019-07-25 22:20:59      阅读:139      评论:0      收藏:0      [点我收藏+]

需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息

 一.服务端 —— 控制输出信息

import socket
import subprocess
#socket实例化一个对象
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#监听的服务端地址
port_ip = (127.0.0.1,8000)
#开启监听
tcp_server.bind(port_ip)
#设置最大监听数量
tcp_server.listen(3)

while True:
    #连接一个请求
    print(等待连接)
    sock,addr = tcp_server.accept()
    print(成功连接到,addr)
    #多次接发消息
    while True:
        # 当一个客户端完成通信后客户端主动断开时会导致服务器抛出异常
        try:
            # 电话接通后接收信息  指定一次接收信息的数量
            data = sock.recv(1000)
            print(接收到客户端的命令,data)
            #如果客户端发送的信息为空,使用此判断即可退出当前循环,不至于程序堵塞
            if not data:break
            #实现远程连接——连接到服务端的控制台命令台
            #可以通过通道PIPE进行数据传输
            proc = subprocess.Popen(
                #需要传输的数据
                data.decode(utf-8),
                shell=True,
                #将标准输入放入通道
                stdin = subprocess.PIPE,
                # 将标准错误放入通道
                stderr = subprocess.PIPE,
                # 将标准输出放入通道
                stdout= subprocess.PIPE,
            )
            #从通道处拿出内容
            err = proc.stderr.read()
            if err:
                result_proc = err
            else:
                result_proc = proc.stdout.read()
            #如果程序有标准输出,但是又为空,就会没有反馈信息给客户端,引起客户端阻塞
            if not result_proc:
                result_proc = 执行成功.encode(gbk)
            # 接收到标准__信息后,反馈给client端,以告诉他已成功接收
            sock.send(result_proc)
        except Exception as e:
            print(e)
            break
    sock.close()
tcp_server.close()

 

二.客户端 —— 基本不变

import socket
#实例化一个socket对象
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接的服务端地址
port_ip = (127.0.0.1,8000)
#连接到服务端
tcp_client.connect(port_ip)

#通讯循环
while True:
    msg = input(>>)
    #对信息进行处理
    if not msg:continue
    if msg == quit:break
    #接通电话后发信息
    tcp_client.send(msg.encode(utf-8))
    print(成功发送信息:,msg)
    #接收反馈信息
    feedback = tcp_client.recv(1000)
    print(成功接收到反馈信息,feedback.decode(gbk))
#关闭连接
tcp_client.close()

 

网络编程[第三篇]基于tcp协议实现远程连接

原文:https://www.cnblogs.com/xxp1624/p/11246925.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!