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'))

 

posted @ 2018-11-29 12:01  风不再来  阅读(130)  评论(0编辑  收藏  举报