Day10 - Python基础10 socketserver 实现并发

本节内容:

1.实例tcp的并发

2.看源代码继承关系

3.详解:ThreadingTCPServer的过程

4.tcp和udp的request 不同

5.基于udp的并发实现

 

1.实例tcp并发

server
client

创建服务器的步骤:

1:首先必须创建一个请求处理类

2:它是BaseRequestHandler的子类

3:该请求处理类是BaseRequestHandler的子类并重新写其handle()方法

 

实例化  请求处理类传入服务器地址和请求处理程序类

最后实例化调用serve_forever()  #无限处理client请求

2.看源代码继承关系 

知识点1:并发我们可以选择 线程方式,或者并发的方式:

if __name__ == '__main__':
    # s = socketserver.ThreadingTCPServer(('127.0.0.1',8991),Myserver)  
    s = socketserver.ForkingTCPServer(('127.0.0.1',8991),Myserver)    ##可以对上点的代码采用进程的方式并发,但是注意的是windows可能会出错
    s.serve_forever()                              ##可以选择把 server 放在linux上面跑

3.详解:ThreadingTCPServer的过程

上述代码的内部调用流程为:

启动服务端程序
执行 TCPServer.__init__ 方法,创建服务端Socket对象并绑定 IP 和 端口
执行 BaseServer.__init__ 方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 Myserver赋值给 self.RequestHandlerClass
执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
当客户端连接到达服务器
执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
执行 ThreadingMixIn.process_request_thread 方法
执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 Myserver的handle方法)

 4.tcp和udp的request 不同

tcp:

 udp:

5:基于udp的并发实现

#########server#######################
import  socketserver

class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        # while 1 :
            print(self.request[1])  ##<socket.socket fd=184, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8991)>
            print(self.request[0])  ##b'2'
            print(self.client_address)  ##('127.0.0.1', 63617)



if __name__ == '__main__':
    s = socketserver.ThreadingUDPServer(('127.0.0.1',8991),Myserver)  ##socket bind listen  实例
    # s = socketserver.ForkingTCPServer(('127.0.0.1',8991),Myserver)  ##socket bind listen  实例
    s.serve_forever()

	
##########client##############

import  socket

ip_port = ('127.0.0.1' ,8991)
buff_size = 1024
s_sk = socket.socket(socket.AF_INET ,socket.SOCK_STREAM)

s_sk.connect(ip_port)

while 1 :
    data = input('PLZ YOUR DATA:').strip()
    if not data :continue
    s_sk.sendall(data.encode('utf-8'))
    data = s_sk.recv(buff_size)
    print('接收客户端返回的数据:',data.decode('utf-8'))

  

posted @ 2018-03-17 01:29  你是我的神奇  阅读(136)  评论(0编辑  收藏  举报