Socketserver分析图
提示:以下是本篇文章正文内容,下面案例可供参考
一、Socketserver分析图
Socketserver分析图:
主要是基于ThreadingTCPServer类的实例化,其中包括传入的server_address 和 RequestHandlerClass类,重要的是其中各类与其基类的继承和有关server对象的实例方法使用。
个人觉得比较重要的一点需要关注一下,就是BaseServer类中有关finish_request方法的介绍,self.RequestHandlerClass(request, client_address, self)中的self其实在这里指的是该ThreadingTCPServer类的实例对象server,自己调用自己,则用self;而对于Myserver类来讲,他继承的是BaseRequestHandler类,其中执行self.handle()的方法名,这里自定义的时候切不可更改该名称,这里实际上是对于handle方法的重写。另外就是涉及到多线程的应用,threading.Thread创建新的线程,每个线程都执行process_request_thread,即:self.RequestHandlerClass(request, client_address, self),即执行我们自定义的Myserver类的实例化以及重写后的handle方法。
class ThreadingMixIn:
def process_request_thread(self, request, client_address):
self.finish_request(request, client_address)
def process_request(self, request, client_address):
threading.Thread(target = self.process_request_thread,args = (request, client_address))
t.start()
二、使用步骤
1. 服务端
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
while 1:
client_data=self.request.recv(1024)
if len(client_data)==0:
print("客户端断开连接,等待新的用户连接....")
break
print ("接受数据 >>>",str(client_data,"utf8"))
response=input("响应数据 >>>")
self.request.sendall(bytes(response,"utf8"))
self.request.close()
server=socketserver.ThreadingTCPServer(("127.0.0.1",8888),Myserver)
server.serve_forever() # 开启了多线程socket.accpet()
2. 客户端
import socket
ip_port = ('127.0.0.1',8888)
sock = socket.socket()
sock.connect(ip_port)
print ("客户端启动:")
while True:
inp = input('发送数据 >>>')
if inp == 'exit':
break
sock.sendall(bytes(inp,"utf8"))
server_response=sock.recv(1024)
print ("服务端响应数据 >>>",str(server_response,"utf8"))
sock.close()
总结
学习socketserver