• tcp/udp


    基于tcp的subprocess操作:

    服务端:
    import  socketserver
    import  subprocess
    
    class Myserver(socketserver.BaseRequestHandler):
        def handle(self):
            print('3次握手conn is', self.request)#conn,3次握手,建立3次握手的过程
            print('客户端返回的ip地址是',self.client_address)#打印的是客户端的ip地址,addr
            while True:
                try:
                    print('开始通信循环了')
                    cmd=self.request.recv(1024)
                    # if not cmd:
                    #     break  # 解决死循环的情况
                    print('收到客户端的消息', cmd.decode('utf-8'))  # 一字节的形式接收到的数据
                    # 执行命令,得到命令的运行结果
                    res = subprocess.Popen(cmd.decode('utf-8'), shell=True,
                                           stderr=subprocess.PIPE,
                                           stdin=subprocess.PIPE,
                                           stdout=subprocess.PIPE)  # 获取的是对象
    
                    response = res.stdout.read()
    
                    if response:
                        print('程序已经执行out')
                        cmd_res = response  # 加入err没有问题的话就读取到stderr的
                    elif not response:
                        print('程序已经执行err')
                        cmd_res = res.stderr.read()
    
    
                    # 发消息
                    self.request.send(cmd_res)
    
    
    
                except Exception as e:
                    print(e)
                    break
    
    if __name__ == '__main__':
        s=socketserver.ThreadingTCPServer(('127.0.2.1',8080),Myserver)#实例化过程,传入2个参数,一个是ip地址,建立链接循环,第二个建立通信循环
        print('已经建立链接')
        s.serve_forever()#永远服务下去
    客户端:
    
    
    from socket import *
    ip_port=('127.0.2.1',8080)
    buffer_size=1024
    back_log=5
    tcp_client=socket(AF_INET,SOCK_STREAM)
    # tcp_client.bind(ip_port)
    tcp_client.connect(ip_port)
    
    while True:
        try:
            print('开始运行客户端1')
            msg=input('输入:').strip()
            if not msg: continue
            else:
                tcp_client.send(msg.encode('utf-8'))
                print('客户端已经发送消息给服务端')
                data=tcp_client.recv(buffer_size)
                print('客户端接收的数据是',data.decode('gbk'))
        except Exception as e:
            print(e)
            break

    基于udp的并发操作:

    request返回的是元组形式的,request【0】是客户端发来的消息
    request【1】是套接字对象
    
    addr是客户端的地址
    
    服务端:
    import  socketserver
    import  subprocess
    #基于udp通信,返回的request为元组形式的,第一个是客户端发送的消息,得个是套接字对象,最后一个是客户单的ip地址,addr
    class Myserver(socketserver.BaseRequestHandler):
        def handle(self):
            print('接收到客户端的命令是',self.request[0].decode('utf-8'))  # 接收的是客户端的消息
            print(self.request[1])  # 接收的是客户端的socket对象
            print(self.client_address)  # 接收的客户端的地址
            while True:
                try:
                #发消息给客户端
                    data=self.request[0].decode('utf-8')
                    res=subprocess.Popen(data,shell=True,
                                 stdout=subprocess.PIPE,
                                 stdin=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
                    cmd_res=res.stdout.read()
                    if cmd_res:
                        content=cmd_res
                    else:
                        content=res.stderr.read()
                    self.request[1].sendto(content,self.client_address)
                    print('服务端已经发送消息给客户端')
                    break
                except Exception as e:
                    print(e)
                    break
    
            # msg=input('输入:').strip()
            # self.request[1].sendto(msg.encode('utf-8'),self.client_address)
            # print('已经发送消息给客户端了',msg)
    
    
    
    #建立udp链接循环
    if __name__ == '__main__':
        s=socketserver.ThreadingUDPServer(('127.1.1.1',8080),Myserver)#传入的第一个参数是ip地址,第二个参数是通信循环
        s.serve_forever()
    客户端:
    import  socketserver
    import subprocess
    from socket import *
    ip_port=('127.1.1.1',8080)
    buffer_size=10240
    back_log=5
    tcp_client=socket(AF_INET,SOCK_DGRAM)
    tcp_client.connect(ip_port)
    
    while True:
        print('开始运行客户端了')
        msg=input('输入:').strip()
        tcp_client.sendto(msg.encode('utf-8'),ip_port)
        print('已经发送消息给服务端了')
        data,addr=tcp_client.recvfrom(buffer_size)
        print('已经接收服务端发来的消息了',data.decode('gbk'))
  • 相关阅读:
    Python Data Analysis Library¶
    matadon/mizuno
    MySQL 5.1参考手册
    Apache Derby: Quick Start
    JRuby大捷:ThoughtWorks宣布Mingle发布在即
    RailsWithH2InJNDIOnJetty
    Embedded Jetty and Spring: The Lightweight Antidote for Java EE Complexity
    window下安装解压缩版mysql/zip压缩文件包非install安装程序
    Chapter 9. Extending Workbench
    Mysql手动增加一列_Blog of Grow_百度空间
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10037467.html
Copyright © 2020-2023  润新知