如何解决ServerSocket端口在运行多个线程时将状态更改为FinWait2java
在我的一位客户的程序中,我遇到了意外的行为。
我的程序正在处理来自多个时间终端的数据,并将数据发送到Notes服务器。 该程序为每个给定的IP地址启动一个NotesThread,该线程负责通过TCP处理Notes服务器和时间终端数据之间的通信。为了退出该应用程序,我实现了另一个正在侦听特定唯一端口的线程。
由于未知原因,第一个ServerSocket在打开第二个TimeTerminal NotesThread时关闭。
Powershell中终止侦听器端口的输出如下所示:
命令:while ($true) { Get-NetTCPConnection -Localport 48678,48679,48680 -ErrorAction "SilentlyContinue"; sleep 1}
- :: 48678 :: 0听
- :: 48678 :: 0听
- :: 48678 :: 0听
- :: 48679 :: 0听
- 127.0.0.1 48678 127.0.0.1 60977 FinWait2数据中心
- :: 48679 :: 0听
- :: 48680 :: 0听
- 127.0.0.1 48678 127.0.0.1 60977 FinWait2数据中心
- :: 48679 :: 0听
- :: 48680 :: 0听
- ...
它的外观:
- :: 48678 :: 0听
- :: 48679 :: 0听
- :: 48680 :: 0听
- :: 48678 :: 0听
- :: 48679 :: 0听
- :: 48680 :: 0听
- :: 48679 :: 0听
- :: 48680 :: 0听
- ....
当前解决方法:由于它仅发生在第一个给定的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 举报,一经查实,本站将立刻删除。