1

サーバーとクライアントの間でテキストを転送するためのGUIを備えたサーバーとクライアントを作成しましたが、うまく機能します。Google で「ネットワーク経由でファイルを送信する方法」を検索したところ、この美しい解決策が見つかりました (Andrey Kozhanov の返信を参照)。リンク内のサーバークラスをサーバーパッケージに移動し、リンク内のクライアントクラスをクライアントパッケージに移動して試してみましたが、うまく機能しました。これで、インスタント テキスト メッセージとインスタント ファイルを送信できるようになりました。

ユーザーの期待に応えるために、コミュニケーションをスムーズに機能させるために必要なことをすべて書きました。

問題は特定のシナリオで発生する問題です。

2 つのサーバーのポート番号は異なります。(テキスト用の鉱山とファイル用のリンクの 1 つ)
ステージ 1
1-クライアントはサーバーにファイルの送信を要求します。2- サーバーは ( Yes )
で応答します( dialog yes-no-options )。 3- クライアントはファイル チューザーのリストをナビゲートします。 4- クライアントはファイル チューザーをキャンセルします (ファイルを送信しませんでした)。 5-サーバーはクライアントのキャンセルについて通知しました。ステージ 2 -再び 1 - クライアントがサーバーにファイルの送信を要求します。2- サーバーは ( Yes ) で応答します。 サーバー側でエラーが発生しました。






エラーの最初の行は次のとおりです。

java.net.BindException: アドレスはすでに使用されています: JVM_Bind

このようにサーバーパッケージで受信スレッドを開始します

        recieverThread = new Recieving();
        recieverThread.setDaemon(true);
        recieverThread.start();

問題はステージ 1の番号 5 (5 - サーバーがクライアントのキャンセルについて通知した)にまでさかのぼります。クライアントからファイルを受信するためのサーバー スレッドが開始されるため、ポイント 5 でそれを停止する必要があります。このスレッドを停止するには、次の組み合わせを使用します

        recieverThread.interrupt();
        recieverThread = null;

しかし、ステージ 2で再び開始すると、まだ実行中であり、停止していないようです。新しいスレッドを開始したいときにエラーが発生しないように、それを強制終了したい。

4

1 に答える 1

3

これはスレッドの問題ではなく、サーバー ソケットの問題です。ソケットをすぐに再利用することは、TCP/IP では許可されていません。これは、再利用者が古いユーザーを対象としたパケットを見る可能性があるためです。

ソケットを再利用する方法については、この質問を参照してください。

于 2013-02-08T08:08:17.403 に答える