シンプルな 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 を使用する価値があり、より優れているのかもしれませんが、内部構造を理解することに非常に興味があります。ありがとう。