socketserver的模块
简介
socketserver模块简化了网络服务器的编写。它有4个类:TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer。这4个类是同步进行处理的,即同一个服务器只能服务一个客户端,如果其他客户端连接服务器,则该客户端处于阻塞状态,直到前一个客户端断开连接才能与服务器交互。另外通过ThreadingMixIn(线程异步)和ForKingMixIn(进程异步)类来支持异步处理,即同一个服务器可以同时与多个客户端交互。
创建异步服务器步骤:
- 首先创建一个请求处理类,它是socketserver模块中BaseRequestHandler类的子类,并重载其handle()方法
- 其次创建一个混合处理类,参数为异步类中ThreadingMixIn、ForKingMixIn的一个,及一个同步处理类
- 最后实例化一个服务器类,传入服务器的(地址,端口)和请求处理类。然后调用serve_forever()方法执行请求
TCPServer同步处理服务器端
import socketserver
"""
这个服务器请求处理类是我们自己定义的,它继承了socketserver的模块中的BaseRequestHandler类,并且要重写父类中的handle方法
"""
class MyTCPHandler(socketserver.BaseRequestHandler):
#服务器与客户端所有的交互都在重写的handle方法中完成
def handle(self):
while True:
try:
#self.request是连接到客户端的TCP的套接字。(或者理解为服务器套接字实例化的对象)
self.data = self.request.recv(1024).strip()
print("客户端地址: %s 端口: %s " % (self.client_address[0], self.client_address[1]))
print("客户端发来的信息:", self.data.decode())
#发送相同信息会给客户端,但改为大写
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err:", e)
break
if __name__ == "__main__":
HOST, POST = "127.0.0.1", 9999
#创建服务器,并绑定地址和端口
server = socketserver.TCPServer((HOST, POST), MyTCPHandler)
server.serve_forever() #永远执行请求
客户端
import socket
HOST, PORT = "127.0.0.1", 9999
# Create a client socket
client = socket.socket()
# Connect to server
client.connect((HOST, PORT))
# loop send
while True:
msg = input("Please enter the information send>>>:").strip()
# 如果数据为空,则让用户重新发送
if (len(msg) == 0): continue
client.send(msg.encode("utf-8"))
data = client.recv(1024)
print("服务器发来的信息:", data.decode())
client.close()
ThreadingMixIn异步处理服务器[多线程并发]
import socketserver
"""
这个请求处理类是我们自己定义的,它继承了SocketServer的模块中的BaseRequestHandler类,并且重写父类的处理方法
"""
class ThreadingMixInTCPHandler(socketserver.BaseRequestHandler):
#服务器与客户端所有的交互都在重写的handle方法中完成
def handle(self):
while True:
try:
#self.request是连接到客户端的TCP的套接字。(或者理解为服务器套接字实例化的对象)
self.data = self.request.recv(1024).strip()
print("客户端地址: %s 端口: %s " % (self.client_address[0], self.client_address[1]))
print("客户端发来的信息:", self.data.decode())
#发送相同信息会给客户端,但改为大写
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err:", e)
break
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
if __name__ == "__main__":
HOST, POST = "127.0.0.1", 9999
#创建服务器,并绑定地址和端口
server = ThreadedTCPServer((HOST, POST), ThreadingMixInTCPHandler) #创建一个新线程实例
server.serve_forever() #永远执行请求
# server = socketserver.ThreadingTCPServer((HOST, POST), ThreadingMixInTCPHandler)
# server.serve_forever() # 永远执行请求
# ThreadingMixIn()方法等同于class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass
#一般不采取该写法
客户端用上面的就可以了
ForkingMixIn的使用方法类似,只不过是用进程代替线程