1 背景
近期在做机器人集群的分布式控制,涉及到了机器人之间的交流工作,其中,每一台机器人都需要与多个机器人进行交流。
考虑使用python的socket来做,但简单测试了一下,socket模块不能方便的实现一个服务器与多客户端的通信,需要使用多线程等方法,程序编写的时间较长,也不是我的主要工作内容,因此寻找一个能够简单实现的方法。
在这个背景下,找到了socketserver,它是用于网络服务器的框架,其介绍参考(socketserver介绍)。
我在它的基础上简单地实现了多客户端访问,这里分享一下。
2 服务器端
# server
import socketserverclass 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", 9999HOST_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 socketHOST = "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)