【问题标题】:Java-Server stops working normallyJava-Server 停止正常工作
【发布时间】:2012-11-22 22:10:25
【问题描述】:

我编写了一个带有多个线程的小型服务器。 很多小时后(据说目前我无法重现该问题)服务器停止工作。我的代码看起来像这样。

线程2:

while(true)
{

                System.out.println("Point 1");
                Socket abc = serverSocket.accept();
                System.out.println("Point 2");
                connection = true;
}

Thread1 在 Thread.sleep(1000) 循环中等待并检查连接是否为真。如果是这样,它开始工作,否则它打印“等待”。如果连接中止,则将连接设置为 false。

现在我的主程序连接到服务器。服务器打印 等待 等待 (依此类推,直到建立连接) 第 1 点 第 2 点 应该的。

现在经过几个小时的运行,我的客户端仍然可以连接,它说连接已建立(通过 clientSocket = new Socket(inetAddress,Integer.parseInt(port)); 假设此命令成功时无异常建立连接)。

在运行 Thread1 多个小时后,无论我与客户端连接的频率如何,都只会打印“等待”、“等待”。 我被它难住了,因为它只有在运行多个小时后才会发生。 Java版本是 java版本“1.7.0_07” Java(TM) SE 运行时环境 (build 1.7.0_07-b10) 此版本是否有任何已知问题或错误在哪里?任何线索如何重现错误?

感谢您的帮助。

【问题讨论】:

  • 您是否考虑过进行线程转储或在调试器中运行服务器以获取有关正在发生的事情的更多信息?
  • 现在。问题1是服务器在另一台机器上作为开发机器运行。问题 2 我发现无法在 eclipse 调试器中暂停线程,然后向我展示它现在执行的位置。那可能吗?如果是这样,您能否发布一个指向该说明的链接?
  • 现在我设法用 Eclipse 进行了调试。服务器现在在开发机器上运行。让我们希望问题再次发生,我能够调试它。

标签: java serversocket


【解决方案1】:

如果您不同步对connection 字段的访问并且它不是volatile 字段,那么一个线程1 可能看不到线程2 中的connection 已更改。这就是Java Memory Model 的工作原理。

【讨论】:

  • 我使用公共静态同步无效 setConnection(布尔连接)形式的带有 atatic 方法的第三类,以避免 jzou 建议。但即使另一个线程不知道连接现在存在也会成为问题,它也不会打印出“点 1 和点 2”。
【解决方案2】:

我终于解决了这个问题。 有那个代码就够了

InetAddress inetAddress = InetAddress.getByName("0.0.0.0");
serverSocket = new ServerSocket(39999,0,inetAddress);

我的客户说已连接。不需要像

这样的代码
Socket neuSocket = serverSocket.accept();

整个线程由于 while 循环之外的 catch 块而终止。 Java 有时非常令人困惑。如果线程在声明 ServerSocket 后停止,则不应再在该套接字上侦听。

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2011-07-15
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多