Python小推车python学习

Python学习打call第四十三天:Socketserver

2019-03-19  本文已影响9人  暖A暖

1.socketserver介绍

        +------------+
        | BaseServer |
        +------------+
              |
              v
        +-----------+        +------------------+
        | TCPServer |------->| UnixStreamServer |
        +-----------+        +------------------+
              |
              v
        +-----------+        +--------------------+
        | UDPServer |------->| UnixDatagramServer |
        +-----------+        +--------------------+

2.Socketserver模块四个基本的服务器类

3.Socketserver模块的两个异步处理类

ForkingMixIn,将UNIX进程分支添加到服务器的混合方法,使用该方法可以让服务器服务多个客户;

ThreadingMixIn,修改服务器的混合类,可以使用多线程服务多个客户端;

继承自这两个类型的服务端在处理新的客户端连接时不会阻塞,而是创建新的进/线程专门处理客户端的请求;

4.BaseRequestHandle类的实例化可以实现的方法

5.TCPServer服务器端代码实现

import socketserver
import threading
from pprint import pprint
class Handler(socketserver.BaseRequestHandler):
    def handle(self):
        print('当前的server类型: {}'.format(self.server))
        print('当前的socket连接对象: {}'.format(self.request))
        print('当前的客户端地址: {}'.format(self.client_address))
        print('线程列表: {}'.format(threading.enumerate()))
        print('当前的线程:{}'.format(threading.current_thread()))
server = socketserver.TCPServer(('127.0.0.1', 9000), Handler)
server.serve_forever()

当前的server类型: <socketserver.TCPServer object at 0x107dcfac8>
当前的socket连接对象: <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 61609)>
当前的客户端地址: ('127.0.0.1', 61609)
线程列表: [<_MainThread(MainThread, started 4486772160)>]
当前的线程:<_MainThread(MainThread, started 4486772160)>

6.socketserver模块创建服务器步骤

7.多客户端的socketserver实现

##############################  服务器端  ##############################

import socketserver
import threading
class Handler(socketserver.BaseRequestHandler):
    clients = {}
    def setup(self):
        super().setup()
        self.event = threading.Event()
        self.clients[self.client_address] = self.request
    def handle(self):
        super().setup()
        while not self.event.is_set():
            data = self.request.recv(1024).decode()
            if data == 'quit':
                break
            msg = "{} 说 {}".format(self.client_address, data).encode()
            print(self.clients)
            if self.client_address in self.clients.keys():
                self.clients[self.client_address].send(msg)
            # if request  self.clients.values():
            #     request.send(msg)
        print('server end')
    def finish(self):
        super().finish()
        self.clients.pop(self.client_address)
        self.event.set()
if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 9000), Handler)
    threading.Thread(target=server.serve_forever, daemon=True).start()
    while True:
        cmd = input('请输入您想说的话: ').strip()
        if cmd == 'quit':
            print(cmd)
            server.shutdown()
            server.server_close()
            break
        else:
            print('您可以输入quit来停止服务器! ')



##############################  客户端  ##############################

import socket
# 创建TCP连接
socket_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_instance.connect(('127.0.0.1', 9000))
while True:
    cmd = input("请输入您想说的话:")
    socket_instance.send(cmd.encode())
    data = socket_instance.recv(1024).decode()
    print(data)

上一篇下一篇

猜你喜欢

热点阅读