2012-01-11 19 views
0

私はPythonでクライアントとサーバー間の通信をしています。サーバーからクライアントに10MBのデータを1つのパッケージで送信する場合、クライアントはこの大きなデータを1つのパッケージで処理できますか?クライアントが1分後にデータを読み取っている場合はどうなりますか?たとえば、私は接続を確立してクライアントに10MBのメッセージを送信しますが、クライアントは1分以上経過してもメッセージを受信することができます。 TCPバッファの大きさはどれくらいですか?データを失う可能性があります(バッファオーバーフロー)。それはサーバーをハングアップしますか?PythonでのTCPソケット動作

time.sleep(60) 
self.request.recv(20480) 

答えて

3

TCPはパケット指向ではなくストリーム指向であるため、TCPでは「1つのパッケージ」について話すことは意味がありません。データは実際にはネットワークスタックの下のIPパケットとして送信されますが、TCPレイヤーは、データがパケットに分割され、受信側でどのように再組み立てされるかを識別できないことを保証します。

TCPバッファサイズは標準では指定されていませんが、サーバー側のバッファがいっぱいになるとサーバーがソケットから読み取られない場合、クライアントは送信を停止します。つまり、TCPはフロー制御を行います。このシナリオでは、実際にクライアントをハングする可能性があります。あなたは何をすべき


が継続的にクライアントからいくつかの扱いやすいサイズのチャンクを(たとえば8K)に送信することで、継続的にサーバ上でお読みください。必要に応じて、プログラムのサーバー側でデータをバッファリングする必要があります。私が言ったように、TCPはパケットを扱わない。