标准库--并发集成模块socketserver

https://docs.python.org/zh-cn/3/library/socketserver.html#module-socketserver

1、socket并发集成模块

  【python2】 SocketServer

  【python3】 socketserver

  【功能】通过模块提供的接口组合可以完成多进程/多线程 tcp/udp的并发程序

2、接口

  【1】StreamRequestHandler         处理tcp请求

  【2】DatagramRequestHandler     处理udp请求

  【3】ForkingMixIn                          创建多进程

  【4】ThreadingMixIn                      创建多线程

  【5】TCPServer                             创建tcp server

  【6】UDPServer                             创建udp server

  【7】ForkingTCPServer    ForkingMixIn + TCPServer

  【8】ForkingUDPServer    ForkingMixIn + UDPServer

  【9】ThreadingTCPServer      ThreadingMixIn + TCPServer

  【10】ThreadingUDPServer    ThreadingMixIn + UDPServer

3、例子

  【多线程UDP并发】

【sock-ser-udp-server.py】
from
socketserver import * class Server(ForkingMixIn,UDPServer): pass class Handler(DatagramRequestHandler): def handle(self): while True: data = self.rfile.readline().decode() if not data: break print(data) #发送消息 self.wfile.write(b"Receive\n") server = Server(('0.0.0.0',8888),Handler) server.serve_forever()
【udp-client.py】
from
socket import * import sys HOST = sys.argv[1] PORT = int(sys.argv[2]) #要访问的服务端地址 ADDR = (HOST,PORT) #创建套接字 sockfd = socket(AF_INET,SOCK_DGRAM) while True: data = input("消息:") if not data: break sockfd.sendto(data.encode(),ADDR) data,addr = sockfd.recvfrom(1024) print("从服务端接收:",data.decode()) sockfd.close()

 【多进程TCP并发】

#多进程 tcp server
from socketserver import * 

#创建server类
# class Server(ForkingMixIn,TCPServer):
# class Server(ForkingTCPServer):
#     pass 

#多线程tcp并发
class Server(ThreadingTCPServer):
    pass


#具体的请求处理类
class Handler(StreamRequestHandler):
    def handle(self):
        # self.request ==> accept返回的套接字
        print("Connect from",\
            self.request.getpeername())
        while True:
            data = self.request.recv(1024).decode()
            if not data:
                break
            print(data)
            self.request.send(b'Receive')

#创建server对象
server = Server(("0.0.0.0",8888),Handler)

#启动服务器
server.serve_forever()

 

from socket import * 

#创建套接字
sockfd = socket()

#发起连接
sockfd.connect(('127.0.0.1',8888))

while True:
    #消息收发
    msg = input("Msg>>")
    if not msg:
        break
    sockfd.sendall(msg.encode())
    data = sockfd.recv(1024)
    print(data.decode())

sockfd.close()

 

posted @ 2021-01-12 13:55  昱成  阅读(92)  评论(0编辑  收藏  举报