私は、あるコンピュータから別のコンピュータにデータを転送するPythonソケットでTCPを使用しています。しかし、recv
コマンドではサーバ側でそれよりも多くのコマンドを読み取るため、問題が見つかりませんでした。TCPソケットが順番に読み取る
client.py
while rval:
image_string = frame.tostring()
sock.sendall(image_string)
rval, frame = vc.read()
server.py
while True:
image_string = ""
while len(image_string) < message_size:
data = conn.recv(message_size)
image_string += data
受け取ったときに、私は印刷するときに、メッセージの長さは、それは、しかしながら、sendall
と921600 (message_size)
送信されます到着したメッセージの長さ、長さが間違っていることがあります。
921600
921600
921923 # wrong
922601 # wrong
921682 # wrong
921600
921600
921780 # wrong
ご覧のとおり、間違った到着にはパターンがありません。私はTCPを使うので、より一貫性があると思いましたが、バッファが混ざっていて、次のメッセージの一部を何とか受け取っているように見えます。 ここで問題は何ですか?
コードの関連部分だけを追加しようとしましたが、必要に応じて追加することができますが、コードはlocalhost
で正常に動作しますが、2台のコンピュータでエラーが発生するため、
EDIT1:私はこのquestionを少し検査、それはすべてのクライアントにコマンドを送信することを言及しているサーバーで単一のrecvで受け取ったことがないかもしれませんが、私は実際にこれを適用する方法を理解できませんでした。
あなたが言うように、私はそれも必要ない、 'recv(message_size)'で十分でしょうか? – Rockybilly
1つの 'recv()'が要求されたバイトをすべて読み取るという保証はありません。これまでにネットワーク経由で受け取ったものがすべてであれば、それは少なくなります。 – jasonharper
ストリームベースの場合は、バッファがメッセージで満たされるまで読み込まないでください。そして、私がこのテーマについてもっと読むことができるリソースがあると、Pythonのドキュメントはこのように短くなります。 – Rockybilly