如何正确停止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(); } } } } 

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

  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? 但即使这样也没有阻止线程? 我搞不清楚了。

有任何想法吗?

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

问题解决了!

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

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