我正在尝试实现一个简单的 UDP 客户端和服务器。服务器应该收到一条消息并返回一个转换后的消息。
我对服务器的主要技术是在循环中侦听 UDP 消息,然后multiprocessing.Process
为每个传入消息生成并在每个Process
实例中发送回复:
class InputProcessor(Process):
...
def run(self):
output = self.process_input()
self.sock.sendto(output, self.addr) # send a reply
if __name__ == "__main__":
print "serving at %s:%s" % (UDP_IP, UDP_PORT)
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP,UDP_PORT))
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print "received message: %s from %s:%s" % (data, addr[0], addr[1])
p = InputProcessor(sock, data, addr)
p.start()
在测试客户端,我做这样的事情:
def send_message(ip, port, data):
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
print "sending: %s" % data
sock.sendto(data, (ip, port))
sock.close()
for i in xrange(SECONDS*REQUESTS_PER_SECOND):
data = generate_data()
p = multiprocessing.Process(target=send_message, args=(UDP_IP,
UDP_PORT,
data))
p.start()
time.sleep(1/REQUESTS_PER_SECOND)
我在上面的代码中遇到的问题是,当REQUESTS_PER_SECOND
高于某个值(~50)时,似乎某些客户端进程会收到发往不同进程的响应,即进程#1 收到进程#2 的响应,反之亦然。
请尽可能批评我的代码,因为我是网络编程的新手,可能会遗漏一些明显的东西。也许出于某种原因,使用 Twisted 甚至更有价值和更好,但是,我对了解内部结构非常感兴趣。谢谢。