11.2创建一个通过TCP协议通客户端进行通信的服务器
- 可以利用socketserver库
from socketserver import BaseRequestHandler,TCPServer
class EcoHandler(BaseRequestHandler):
def handle(self):
print("Got connection from",self.client_address)
while True:
msg = self.request.recv(8192)
if not msg:
break
self.request.send(mgs)
if __name__ == '__main__':
serv =TCPServer(('',2000),EchoHandler)
serv.serve_forver()
-
这份代码中我们定义了一个特殊的处理类,它实现了一个handle方法来服务客户端链接,这里request属性就代表着底层的客户端socket,而client_address中包含了客户端地址
-
要测试这个服务端程序,首先运行该脚本,然后打开另一个Python进程链接到该服务端上
>>> from socket import socket,AF_INET,SOCK_STREAM
>>> s = socket(AF_INET,SOCK_STREAM)
>>> s.connect(('localhost',20000))
>>> s.send(b'hello')
5
>>> s.recv(8192)
b'hello'
>>>
- 在许多情况下,定义一个类型稍有不同的处理类可能会更加简单
- 下面的示例使用StreamRequestHandler作为基类,给底层的socket加上文件类型的接口
from socketserver import StreamRequestHandler,TCPServer
class EchoHandler(StreamRequestHandler):
def handle(self):
print("Got connection from",self.client_address)
for line in self.rfile:
self.wfile.write(line)
if __name__ == '__main__':
serv =TCPServer(('',20000),EchoHandler)
serv.serve_forever()
- socketserver模块默认方法只能是单线程,一次只能处理一个客户端,如果想要处理多个客户端,可以实例化ForkingTCPServer或者ThreadingTCPServer对象,如:
if __name__ == '__main__':
serv =ThreadingTCPServer(('',20000),EchoHandler)
serv.serve_forever()
- 可以使用多个客户端链接
~/ning-dashboard/tmp > python3 sockettest.py 10s
Got connection from ('127.0.0.1', 54186)
Got connection from ('127.0.0.1', 54292)
网友评论