次のコード スニペットがあります。
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 のバインドを解除します!
コードとして失敗するのに、受信リクエストを受け入れるのはなぜですか?