1. What is socketserver?
- socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver 是 socket 的再封装。
socketserver 在 python2 中为 SocketServer,在 python3 取消了首字母大写,改名为 socketserver。 - socketserver中包含了两种类,一种为服务类(server class),一种为请求处理类(request handle class)。
前者提供了许多方法:像绑定,监听,运行……(也就是建立连接的过程);
后者则专注于如何处理用户所发送的数据(也就是事务逻辑)。
一般情况下,所有的服务,都是先建立连接,也就是建立一个服务类的实例,然后开始处理用户请求,也就是建立一个请求处理类的实例。
2. what types?
- class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
- class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
- class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
- class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
3. How to use socketserver?
- 创建一个请求处理的类,并且这个类要继承 BaseRequestHandlerclass,并且还要重写父类里 handle( ) 方法;
- 你必须实例化 TCPServer,并且传递 server 的 IP 和你上面创建的请求处理类给这个TCPServer;
- server.handle_requese() 只处理一个请求
server.server_forever() 处理多个请求,永远执行; - 关闭连接server_close()。
4. Example?
服务端:
BUFFERSIZE=1024*2
import socketserver
from socketserver import BaseRequestHandler
import multiprocessing
import threading
class MyTcpHandler(BaseRequestHandler):
def handle(self):
# the request as self.request ==== clientSock
# client address as self.client_address
# the server as self.server
while True:
# 获取客户端传递的数据
self.data = self.request.recv(BUFFERSIZE)
print("{0} 传输数据 {1}".format(self.client_address, self.data))
self.request.send(self.data.upper())
if __name__ == "__main__":
HOST = '172.25.254.67'
PORT = 5000
# server = socketserver.TCPServer((HOST, PORT), MyTcpHandler)
# server = socketserver.ThreadingTCPServer((HOST, PORT), MyTcpHandler)
server = socketserver.ForkingTCPServer((HOST, PORT), MyTcpHandler)
server.serve_forever()
客户端(进行实验时多写几个客户端实现多线程,此处写两个客户端看实验效果):
import socket
# 1. 创建一个socket对象
client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2. 连接服务端
client.connect(('172.25.254.67',5000))
while True:
# 3. 给服务端回复消息
sendData = input('client:>> ')
if not sendData:
continue
if sendData == 'quit':
print('聊天结束......')
break
client.send(sendData.encode('utf-8'))
# 4. 接收客户端发送的消息
recvData = client.recv(1024)
print('客户端接收的消息:',recvData.decode('utf-8'))
# 5.关闭socket对象
client.close()
启动服务端,运行第一个客户端,并向服务端发送命令,服务端向客户端返回命令结果:
运行第二个客户端,并向服务端发送命令,服务端向客户端返回命令结果:
返回服务端,接收到客户端发送的消息: