使用Python的socketserver实现多客户端访问的服务器
1 背景
近期在做机器人集群的分布式控制,涉及到了机器人之间的交流工作,其中,每一台机器人都需要与多个机器人进行交流。
考虑使用python的socket来做,但简单测试了一下,socket模块不能方便的实现一个服务器与多客户端的通信,需要使用多线程等方法,程序编写的时间较长,也不是我的主要工作内容,因此寻找一个能够简单实现的方法。
在这个背景下,找到了socketserver,它是用于网络服务器的框架,其介绍参考(socketserver介绍)。
我在它的基础上简单地实现了多客户端访问,这里分享一下。
2 服务器端
# server
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
# 接收客户端请求的数据
self.data = self.request.recv(1024).strip()
print("{} 发送了:{}".format(self.client_address[0], self.data))
# 向客户端发送响应数据
#self.request.sendall(self.data.upper())
my_agent_status = "Agent #3, target = 2"
self.request.sendall(my_agent_status.encode('utf-8'))
if __name__ == "__main__":
# 创建服务器,绑定 IP 地址和端口号
#HOST, PORT = "localhost", 9999
HOST_local = "127.0.0.1"
HOST_agent3 = "192.168.3.29"
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
server = socketserver.TCPServer((HOST_local, PORT), MyTCPHandler)
# 启动服务器
server.serve_forever()
3 客户端
# client
import socket
HOST = "127.0.0.1"
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
#s.sendall(b"HEllo, world")
s.sendall(b"Agent #1 is asking for current status...")
data = s.recv(1024).decode('utf-8')
print("Recieved")
print(data)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
#s.sendall(b"HEllo, world")
s.sendall(b"Agent #1 is asking for current status...")
data = s.recv(1024).decode('utf-8')
print("Recieved")
print(data)