如何正确停止ServerSocket线程?关闭套接字失败

nyy*_*kki 1 java multithreading serversocket

我知道之前已经讨论过这个问题了,但我找不到合适的解决方案来解决我的问题.我想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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试着像这样处理它的行为:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

不知怎的,我无法阻止InternalCamSender那样.我试过volatile boolean以前,是一样的.我阅读了http://download.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html页面并尝试了示例我应该使用什么而不是Thread.stop?但即使这样也没有阻止线程?我搞不清楚了.

有任何想法吗?

编辑: 找到我的clinet发送问题的答案http://www.petanews.de/code-snippets/java/java-threads-sauber-beenden-ohne-stop/ 即使我不知道为什么这样做.我相信我之前尝试过这种方式.

问题解决了!

mat*_*t b 5

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

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