socketserver实现并发

2018-11-27 08:31:25来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、socketserver

    基于tcp,使用socketserver,可以实现一个服务端与多个客户端通信。

  • 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
  • socketserver模块中分为两大类:server类(解决链接问题)和request类(解决通信问题)
  • 链接循环:循环建立连接,每个客户都可以连接成功
  • 通迅循环:每个客户端链接成功后,循环的和客户端进行通信

完整的socketserver代码示例:

服务端:

import socketserver


class Myserver(socketserver.BaseRequestHandler):

    def handle(self):
        while 1:
            from_client_msg = self.request.recv(1024)
            print(from_client_msg.decode("utf-8"))
            server_msg = input("服务端>>>")
            self.request.send(server_msg.encode("utf-8"))


if __name__ == '__main__':
    ip_port = ("127.0.0.1", 8001)
    server = socketserver.ThreadingTCPServer(ip_port, Myserver)
    server.serve_forever()
server端

客户端:

import socket


client = socket.socket()
client.connect(("127.0.0.1", 8001))

while 1:
    client_data = input("客户端>>>")
    client.send(client_data.encode("utf-8"))

    from_server_msg = client.recv(1024)
    print(from_server_msg.decode("utf-8"))
client端

    此时即可在一个服务端下,运行多次客户端程序,实现同时与服务端通信。

二、socketserver源码分析

1. server = socket.ThreadingTCPServer(ip_port, Myserver)

    创建ThreadingTCPServer对象server

  • 根据MRO,查找顺序为:ThreadingTCPServer -> ThreadingMixIn -> TCPServer -> BaseServer
  • 执行TCPServer __init__方法,进而执行server.bind(),server.listen(5)

2. server.serve_forever()

    BaseServer中找到serve_forever()

    进而执行self._handle_request_noblock()

  • request, client_address = self.get_request(), 在TCPServer中找到get_request(),返回self.socket.accept(),即执行利等待连接代码,request为管道,client_address为客户端地址。
  • 执行self.process_request(request, client_address)
  • 在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address)
  • 在BaseServer中找到self.finish_request(request, client_address), 执行RequestHandlerClass(request, client_address, self)

至此,链接循环已完成,接下来完成通信循环:

  • RequestHandlerClass(request, client_address, self)即Myserver(request, client_address, self),创建对象
  • 在BaseRequestHandler找到 __init__(),完成初始化,执行self.handle(),BaseRequestHandler中handle()方法内容为pass,即通信内容根据需求我们自己实现。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python常量和变量

下一篇:python用户交互