【问题标题】:How to stop ServerSocket Thread correctly? Close Socket failed如何正确停止 ServerSocket 线程?关闭套接字失败
【发布时间】:2011-04-06 15:46:50
【问题描述】:

我知道这已经讨论过好几次了,但我找不到适合我的问题的解决方案。我想在后台运行一个ServerSocket 线程,监听指定的端口。它实际上有效,但只有一次。似乎服务器正在侦听的端口从未正确关闭并且在我尝试重新启动时仍然处于活动状态(O 不要重新启动线程本身)。有人能说出为什么它不能正常工作吗?提前感谢您的帮助...!

编辑:

我在客户端有同样的问题。我有一个发件人线程,而且不能停止。最好的方法是什么?

ClientConnector 只是一个连接到服务器端口并发送数据的类。 这不是线程或类似的东西。

这是我的发件人类:

private class InternalCamSender extends Thread {

    private int sendInterval = 500;             // default 500 ms
    private ClientConnector clientConn = null;

    public InternalCamSender() {
        this.sendInterval = getSendingInterval();
        this.clientConn = new ClientConnector();
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            clientConn.sendCamPdu(CodingScheme.BER, createNewPDU());
            try {
                Thread.sleep(sendInterval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

我尝试处理这样的行为:

    if(jButton_startSending.getText().equals(STARTSENDING)) {
        new Thread() {
            public void run() {
                iSender = new InternalCamSender();
                iSender.start();
                jButton_startSending.setText(STOPSENDING);
            }
        }.start();
    } else {
        new Thread() {
            public void run() {
                if(iSender.isAlive()) {
                    iSender.interrupt();
                    try {
                        iSender.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                iSender = null;
                jButton_startSending.setText(STARTSENDING);
            }
        }.start();
    }

不知何故,我无法像那样阻止InternalCamSender。我之前尝试过volatile boolean,结果是一样的。我阅读了http://download.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 页面并尝试了示例我应该使用什么来代替 Thread.stop? 但即使这样也没有停止线程?我迷路了。

有什么想法吗?

编辑: 在这里找到了我的客户端发送问题的答案http://www.petanews.de/code-snippets/java/java-threads-sauber-beenden-ohne-stop/ 即使我不知道为什么会这样。我确定我以前尝试过这种方式。

问题解决了!

【问题讨论】:

  • 您之前的应用实例仍在运行。先杀了它。
  • 我想,但如何...包括正确关闭流和端口?

标签: java multithreading serversocket


【解决方案1】:

您应该在 finally 块而不是 catch 块中关闭您的资源(流和套接字) - 这样资源总是关闭,无论是否捕获到异常。

从 catch 块或线程中调用 System.exit() 也是一种不好的做法 - 在任何错误实例上都强制关闭整个 JVM。这也可能是您的服务器套接字出现问题的原因 - 每当在读取/关闭流时遇到任何异常时,您都会在有机会关闭服务器套接字之前退出 JVM。

【讨论】:

  • 对我来说听起来很合理(
  • 如果存在虚拟机,则关闭所有套接字。
  • @irreputable 你能解释一下你的意思吗?如果 JVM 退出,ServerSocket 使用的端口不会自动释放以供重用,请参阅stackoverflow.com/questions/767292/…
  • 我从来没有经历过 - 服务器套接字在 VM 退出后仍然监听几分钟(?!)。由于该状态在close() 之后,因此在VM 退出之前调用close() 的补救措施不会产生任何影响。在任何情况下,VM 退出都会触发您想要确保被调用的相同 close()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多