使用socketserver创建一个服务的步骤
1 创建一个request handler class(请求处理类),合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类(当然,使用BaseRequestHandler作为父类也可),并重写它的handle()方法。
2 实例化一个server class对象,并将服务的地址和之前创建的request handler class传递给它。
3 调用server class对象的 handle_request() 或 serve_forever() 方法来开始处理请求。
服务端代码
import socketserver
from socketserver import BaseRequestHandler
class MyServer(socketserver,BaseRequestHandler):
def handle(self):
conn = self.request
addr = self.client_address
print('conn:',conn)
print('addr',addr)
while True:
try:
# 接收消息
data = conn.recv(1024)
if not data: break
print('data from client:',data)
# 发送消息给客户端
conn.sendall(data.upper())
except Exception as e:
print(e)
break
ip_port = ('127.0.0.1',8000)
if __name__ == '__main__':
s = socketserver.ThreadingTCPServer(ip_port,MyServer) # 多线程
# s = socketserver.ForkingTCPServer(ip_port,MyServer) # 多进程
# BaseServer.serve_forever(poll_interval=0.5): 处理请求,直到一个明确的shutdown()请求。
# 每poll_interval秒轮询一次shutdown。忽略self.timeout。如果你需要做周期性的任务,建议放置在其他线程。
s.serve_forever()
https://www.cnblogs.com/MnCu8261/p/5546823.html
https://www.cnblogs.com/sean-yao/p/7836400.html
Baseserver中的属性
- server_address 初始实例化时的ip地址
- RequestHandlerClass 初始实例化时的Handler处理类
- socket socketserver中的socket对象
- …
socketserver.BaseRequestHandler类中属性
基于tcp的socketserver我们自己定义的类中的
- self.server即套接字对象
- self.request即一个链接
- self.client_address即客户端地址
基于udp的socketserver我们自己定义的类中的
- self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b’adsf’, <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=(‘127.0.0.1’, 8080)>)
- self.client_address即客户端地址