使用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)

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Python的socketserver实现多客户端访问的服务器

发表评论