gpt4 book ai didi

java - ServerSocket 接受行为

转载 作者:行者123 更新时间:2023-12-01 15:57:55 27 4
gpt4 key购买 nike

我有以下代码片段:

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 再次出现在我的屏幕上。因此,我第二次尝试再次运行此代码时,给出“连接被拒绝”。

“10”是我的一个 hack,但原始代码也从不使用积压。

请问有什么建议吗?

执行前面的代码是:

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”证实了这一点!

所以我从另一个窗口重新运行(第二次)程序,传递所有 HELLO 消息并完成工作!

然后线程就停在远端PC上,并解绑端口63456!

为什么它作为代码失败,但接受传入请求?

最佳答案

根据此代码,您应该只能看到 HELLO1 一次。然而,此代码的调用者很可能处于循环中,否则检查 servsock 的先前值是没有意义的。

这是要做什么?

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

当您遇到异常时,不要像没有发生一样继续。

如果您想了解代码在做什么,我建议您使用调试器来单步调试代码。

关于java - ServerSocket 接受行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4693171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com