2010-12-14 11 views
1

私はいくつかのソケット/選択プログラミングを行っています。私のイベントの1つは、受信バイト文字列'OK'によって引き起こされます。私はutf_8を使用して、サーバーから送信されたすべてをエンコードし、クライアント上でデコードしています。しかし、私のクライアントの比較は機能していないし、私のifステートメントは本当に評価されることはありません。ここで問題のコードは次のとおりです。python3で文字列とデコードされたユニコードを比較する

サーバー側:

def broadcast_string(self, data, omit_sock): # broadcasts data utf_8 encoded to all socks 
    for sock in self.descriptors: 
     if sock is not self.server and sock is not omit_sock: 
      sock.send(data.encode('utf_8')) 
    print(data) 

def start_game(self): # i call this to send 'OK' 
    data = 'OK' 
    self.broadcast_string(data, 0) 
    self.new_round() 

クライアント側:

else: # got data from server 
    if data.decode('utf_8') == 'OK': # i've tried substituting this with a var, no luck 
     self.playstarted = True 
    else: 
     sys.stdout.write(data.decode('utf_8') + "\n") 
     sys.stdout.flush() 

    if self.playstarted is True: # never reached because if statement never True 
     command = input("-->") 

私はthisを読んでいると私は、私はそれに従うが、明らかではないと思います。私もPythonシェルを使って例を書いて、Trueと評価していましたが、このプログラムを実行していませんでした。

ありがとうございます!

+0

。何が印刷されますか? – Robert

+0

OKがstdoutに出力されます。申し訳ありませんが、私はインデントを編集してより明確にしました。最後のif文は、if、elseにネストされていてはなりません。 – Andrew

+0

python3では、 'str'はまだ型名ですか?あなたはちょうど型メソッドを呼び出すことができるので。 – Robert

答えて

1

TCPソケットにはメッセージ境界がありません。あなたの最後のコメントによると、1つの長い文字列に複数のメッセージが表示されています。完全なメッセージが得られてから完全なメッセージとして処理するまで、データのキューイングを行う責任があります。

selectは、ソケットに何らかのデータがあると言うと、のデータをバッファに読み込み、バッファに完全なメッセージが含まれているかどうかを確認します。そうであれば、バッファの先頭からメッセージを抽出して処理します。完全なメッセージが見つからなくなるまで続け、selectに再度電話してください。それ以外の場合は部分的なUTF-8マルチバイト文字を受け取る可能性があるので、decodeという完全なメッセージだけを表示するようにしてください。

メッセージターミネータ(なしエラー処理)として\nを使用してラフ例:

あなたが「他」を打つべきである
tmp = sock.recv(1000) 
readbuf += tmp 
while b'\n' in readbuf: 
    msg,readbuf = readbuf.split(b'\n',1) 
    process(msg.decode('utf8')) 
関連する問題