ServerSocket接受行为

时间:2011-01-14 16:15:57

标签: java serversocket

我有以下代码片段:

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!");

此代码在runnable的run()方法中运行,当文件传输完毕后,它应该停止每次通信。

好奇的是,它不是一个循环。代码接受,确实进行文件传输,但我不明白为什么HELLO1再次出现在我的屏幕上。因此,我第二次尝试再次运行此代码时,会给我“拒绝连接”。

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

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

然后线程在远程PC中停止,并取消绑定端口63456!

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

1 个答案:

答案 0 :(得分:1)

根据此代码,您应该只看一次HELLO1。但是,这个代码的调用者很可能处于循环中,否则就无法检查servsock的先前值。

这是怎么回事?

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

当您收到异常时,请不要继续,就好像它没有发生一样。

如果您想了解代码的作用,我建议您使用调试器来逐步执行代码。