2017-04-21 9 views
0

私は送受信の仕組みを理解しようとしています。破損した情報を受け取っているPythonソケット

私はサーバーにデータを継続的に送信しようとしていました。私は一度に多くのデータを送信していたので、サーバーが混合バイトを受信することに気付きました。私のコードを参照してください。

サーバー:

import socket, struct 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server.bind(("",1996)) 

server.listen(0) 

c,d = server.accept() 

while True: 

    data = c.recv(1024) 
    print(struct.unpack("i", data)[0]) 

クライアント:

import socket, struct 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server.connect(("192.168.1.4",1996)) 

while True: 

    data = 1 
    server.send(struct.pack("i", data)) 

それから私はしばらくの間は、これにループを変更:

サーバー:

data = c.recv(1024) 
print(struct.unpack("i", data)[0]) 
c.send(str.encode("Server received your message. You now can continue 
sending more data")) 

クライアント:

data = 1 
server.send(struct.pack("i", data)) 

#Wait to secure the send. 
server.recv(1024) 

これは機能しています。 サーバーが以前の送信を受信する前に、クライアントがデータを送信しないことを確認しています。

しかし、もし私もサーバーのために同じことをしたいですか?サーバーが安全にクライアントにバイトを送信するようにするにはどうすればよいですか?

私はすでにこれを試みたと私は(私は、サーバー上で同時に送受信するために、マルチスレッドを使用)ので、無限ループを作成したことに気づく。そして、

クライアントはいくつかのデータを送っていたし、彼が再び送信できるサーバ からの信号を得るのを待っています。

サーバーは何らかのデータを受信して​​から、信号を送信した後、ユーザーからの信号を待ってから再度送信できます。

しかし、クライアントが実際にデータをもう一度送信していたため、すべてのことがやり直していたため、無限のトークリプライループが発生しました。

バイトを混ぜずに2つのソケット間で連続して会話するにはどうすればよいですか?

答えて

1

あなたの問題はNagle algorithmによって発生します。小さな送信メッセージを多数組み合わせ、一度に送信するのはTCPです(ストリームプロトコル)。 TCP_NODELAYソケットオプションを有効にするには、わずかな量のデータがあっても、できるだけ早くsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)にデータを送信します。受信側では、一度に1つのパケットを取得することはありません。「バイトを混在させずに2つのソケット間で連続的な会話をしたい」場合は、メッセージ境界を実装する必要があります。

関連する問題