0

次のコード スニペットがあります。

if (servsock == null) {
    System.out.println("HELLO1!");
    servsock = new ServerSocket(63456, 10);
    System.out.println("HELLO2!");
}
try {
    System.out.println("HELLO3!");
    sock = servsock.accept();
} catch (Exception ex) {
    if (servsock != null && !servsock.isClosed()) {
        System.out.println("PICO1!");
        servsock.close();
    }
    if (servsock != null && servsock.isClosed()) {
        System.out.println("PICO2!");
        manager.log("SERVER SOCKET closed and nulled.");
        servsock = null;
    }
    sock = servsock.accept();
}
System.out.println("HELLO4!");
is = sock.getInputStream();
System.out.println("HELLO5!");
bis = new BufferedInputStream(is);
System.out.println("HELLO6!");

このコードはランナブルのrun()メソッドで実行され、ファイルが転送されると、すべての通信を停止することになっています。

奇妙なことに、これはループではありません。コードは受け入れ、ファイル転送を行いますが、HELLO1 が再び画面に表示される理由がわかりません。したがって、このコードを 2 回目に実行しようとすると、「接続が拒否されました」というメッセージが表示されます。

「10」は私からのハックでしたが、元のコードではバックログも使用していません。

何か提案はありますか?

前のものを実行しているコードは次のとおりです。

final IClientInterface clientInterface = client.getClient();
final prgHolder = new ProgHolder();
Pong ftppong = new Pong();
ftppong.setFileNames(bout64.toByteArray());
ftppong.setDstFolder(dstFolder);
prgHolder.setName("pong");
prgHolder.setTask(pong);
Thread t = new Thread(new Runnable() {
    public void run() {
        try {
            IClientInterface.execute(prgHolder);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
});
t.start();

正確な問題は、新しい ServerSocket(63456) コマンドに到達すると、クライアントは「接続が拒否されました」と表示されますが、遠く離れた PC のプログラムは広く開かれていて、リスナーが広いということです! 「netstat」はそれを確認します!

そこで、別のウィンドウからプログラムを (2 回目) 再実行し、すべての HELLO メッセージを渡し、ジョブを完了します!

その後、スレッドは離れた PC で停止し、ポート 63456 のバインドを解除します!

コードとして失敗するのに、受信リクエストを受け入れるのはなぜですか?

4

1 に答える 1

1

このコードに基づいて、HELLO1 が 1 回だけ表示されるはずです。ただし、このコードの呼び出し元がループしている可能性が高いです。そうでない場合は、servsock の以前の値をチェックしても意味がありません。

これは何をするつもりですか?

servsock = null;
}
sock = servsock.accept();

例外が発生した場合、それが起こらなかったかのように続行しないでください。

コードの動作を理解したい場合は、デバッガーを使用してコードをステップ実行することをお勧めします。

于 2011-01-14T16:22:09.327 に答える