简介
SocketServer是python的一个网络服务器框架,可以减少开发人员编写网络服务器程序的工作量。
SocketServer总共有4个server基类。
TCPServer:负责处理TCP协议。
UDPServer:负责处理UDP协议。
UnixStreamServer:只适用于类unix平台,不常用。
UnixDatagramServer:只适用于类unix平台,不常用。
这4个类会同步处理每一个request,也就是说只有当前的request处理完才会处理下一个request,这种方式显然很不合理,如果当前的request处理过慢的话就会导致“堵塞”。正确的处理方式应该是开辟新的进程或线程去处理不同的request,通过混合继承ForkingMixIn或ThreadingMixIn类即可解决此问题。
创建socketserver
- First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.
- Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
- Then call the handle_request() or serve_forever() method of the server object to process one or many requests.
- Finally, call server_close() to close the socket.
import socketserver
class MyTCPHandle( socketserver.BaseRequestHandler ): #创建一个继承自 SocketServer.BaseRequestHandler 的类,并重构handle方法
def handle(self):
while True:
try:
self.data = self.request.recv(1024).decode()
self.request.send(self.data.upper().encode())
except ConnectionResetError as e:
print("ConnectResetError:", e)
break
finally:
print("ok")
if __name__ == '__main__':
#server = socketserver.TCPServer(('localhost', 6969), MyTCPHandle) #单线程
server = socketserver.ThreadingTCPServer(('localhost', 6969), MyTCPHandle) #多线程
#server = socketserver.ForkingTCPServer(('localhost', 6969), MyTCPHandle) #多进程,windows不可用
server.serve_forever()
socketserver使用异常处理客户端断开的情况
ftp的高级版本:https://github.com/jinboxu/ftp_advanced