2

2 つのスレッドが同じソケットを同時に使用できますか?

たとえば、最初に Android クライアントと Windows 7 サーバー間の接続を表すソケットを開きます。DataOutputStream を使用してファイルのサイズである整数を送信したい。この後、BufferedOutputStream を使用して pdf などのバイナリ ファイルを送信します。

サーバーはクライアントから送信されたサイズを取得し、受信したファイルのサイズが正しいサイズであるかどうかを確認します。送信整数、ファイル サイズ番号を、受信したファイルの実際のサイズと比較します。サーバーがファイルが完全ではないことを認識していない場合、サーバーはメッセージをクライアントに送り返し、ファイルを再度送信するように要求します。

私は、約 5% の確率でファイルが不完全なものとして受信されるアプリを持っています。実際のサイズより小さく届きます。この問題を解決する唯一の方法は、ファイルが完全でない場合に再送信することです

ファイルを送信する場合、ポートを開いて、ファイルが完全に受信されたか、再送信する必要があるかをクライアントに伝えるメッセージをサーバーから受信するのを待つ必要があります。

そのため、1 つのスレッドでソケットを使用してメッセージをリッスンし、別のスレッドでメッセージを送信することは可能です。そのため、メッセージがサーバーから受信されている場合、同時にメッセージが送信されています。

1 つのスレッドのみを使用するとブロックされ、2 つのスレッドが必要であることは明らかですが、同じソケットを使用するには、これに問題がある可能性がありますか?

4

2 に答える 2

0

あるスレッドを使用してサーバーにデータを送信し、別のスレッドを待機させて応答をリッスンし、応答を受信したときに何らかの処理を行うことができます。

複数のスレッドが同じソケットを使用してデータを送信している場合、データのインターリーブが発生する可能性が高くなります。

スレッドロックを使用して複数のスレッドでデータを送信するために単一のソケットを使用できます (例: Android のロックと Linux のミューテックス)。

お役に立てれば

于 2013-09-20T06:23:24.310 に答える