微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ServerSocket端口在运行多个线程时将状态更改为FinWait2java

如何解决ServerSocket端口在运行多个线程时将状态更改为FinWait2java

在我的一位客户的程序中,我遇到了意外的行为。

我的程序正在处理来自多个时间终端的数据,并将数据发送到Notes服务器。 该程序为每个给定的IP地址启动一个NotesThread,该线程负责通过TCP处理Notes服务器和时间终端数据之间的通信。为了退出该应用程序,我实现了另一个正在侦听特定唯一端口的线程。

由于未知原因,第一个ServerSocket在打开第二个TimeTerminal NotesThread时关闭

Powershell中终止侦听器端口的输出如下所示:

命令while ($true) { Get-NetTCPConnection -Localport 48678,48679,48680 -ErrorAction "SilentlyContinue"; sleep 1}

  1. :: 48678 :: 0听
  2. :: 48678 :: 0听
  3. :: 48678 :: 0听
  4. :: 48679 :: 0听
  5. 127.0.0.1 48678 127.0.0.1 60977 FinWait2数据中心
  6. :: 48679 :: 0听
  7. :: 48680 :: 0听
  8. 127.0.0.1 48678 127.0.0.1 60977 FinWait2数据中心
  9. :: 48679 :: 0听
  10. :: 48680 :: 0听
  11. ...

它的外观:

  1. :: 48678 :: 0听
  2. :: 48679 :: 0听
  3. :: 48680 :: 0听
  4. :: 48678 :: 0听
  5. :: 48679 :: 0听
  6. :: 48680 :: 0听
  7. :: 48679 :: 0听
  8. :: 48680 :: 0听
  9. ....

当前解决方法:由于它仅发生在第一个给定的IP地址上,因此我刚刚添加了另一个IP地址(未使用),最终被关闭(请参见示例)。但是至少我所有的终端都保持运行。

程序是使用Java 1.6编译的。

这是TerminateThread类的代码段:

public void run() {     
    ServerSocket listenSocket = null;
    Socket clientSocket = null;

    try {
        listenSocket = new ServerSocket(port);
        clientSocket = listenSocket.accept();
    } catch (IOException ioe) { 
            // log output
    } finally {
        try {
            clientSocket.close();
            listenSocket.close();
        } catch (Exception ex) { 
            // log output
        }
    }
}

对于每个IP地址,NotesThread这样启动:

for (String IP: IPs) {
        new TimeTerminalService(IP,port,AllowLog,terminatePort,LogPath).start();
        if (serviceCounter < serviceCount) {
            try {
                Thread.sleep(5000);
                serviceCounter++;
                terminatePort++;
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
        }
    }

我在日志文件中没有收到任何异常消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。