第1に、ターゲットAPIを管理している場合は、すべてのメッセージに対して回答を実装することをお勧めします。送信されたすべてのメッセージに対する返信ACK(確認応答)は、APIをより堅牢にし、この問題を完全に回避します。それはオプションがない場合は
、その後、私は、異なるタイプのメッセージ用のクラスを作成します。
class Message(object):
def __init__(self, msg):
self.msg = msg
class MessageWReply(Message):
await_reply = True
class MessageNoReply(Message):
await_reply = False
があなたのメッセージクラスのすべてを作成し、その後、このようにそれらを使用します。
def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))
if message.await_reply:
data = s.recv(1024)
print(data)
を代わりにすべてのクラスを作成するオーバーヘッドを必要としない場合は、辞書を使用してメッセージを正しいアクションにマップできます。
messages = {
'message with reply 1': True, # wait for reply
'message with reply 2': True,
'message with reply 2': True,
'message without reply 1': False, # don't wait for reply
'message without reply 2': False
}
次にこれを行う:
def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))
if messages[message]:
data = s.recv(1024)
print(data)
第2の方法は、掃除機の初期化(以下定型コード)を有しているが、少しあまり明確ではありません。コードに慣れていない人にとっては、は明瞭であるが、messages[message]
に格納されている値が実際にどのような意味を持っているのかははっきりしない。 named tuplesのようなものは良い妥協点かもしれません - 明快にするために名前付きフィールドを使用しながら、すべてのデータ構造を初期化することができます。
はお使いのOSによって異なる場合がありますが、おそらく 'select'モジュールが有効でしょうか? – thebjorn