我的应用程序java,在服务器上运行,打开端口并通过套接字与设备建立连接。 Everythings一直运行到某个点,很多连接都停留在CLOSE_WAIT,即使我的应用程序在我收到的数据包上完成了这个过程。
我所说的是CPU开始使用双重资源,开放文件正在增加,CLOSE_WAIT状态的数量也在增加。
在wireshark中,发送的数据包离开了CLOSE_WAIT状态,我们看到服务器没有向客户端发送FIN。
PS:我在ubuntu 14.04可靠服务器上,我正在使用Netty 3.10.1
以下是我制作管道的代码:
@Override
public ChannelPipeline getPipeline() {
ChannelPipeline pipeline = Channels.pipeline();
if (resetDelay != null) {
pipeline.addLast("idleHandler", new IdleStateHandler(GlobalTimer.getTimer(), resetDelay, 0, 0));
}
pipeline.addLast("openHandler", new OpenChannelHandler(server));
if (loggerEnabled) {
pipeline.addLast("logger", new StandardLoggingHandler());
}
addSpecificHandlers(pipeline);
if (filterHandler != null) {
pipeline.addLast("filter", filterHandler);
}
if (reinitializeHandler != null) {
pipeline.addLast("reinitialize", reinitializeHandler);
}
if (refineHandler != null) {
pipeline.addLast("refine", refineHandler);
}
if (noFilterHandler != null) {
pipeline.addLast("nofilter", noFilterHandler);
}
if (specificFilterHandler != null) {
pipeline.addLast("specificfilter", specificFilterHandler);
}
if (reverseGeocoder != null) {
pipeline.addLast("geocoder", new ReverseGeocoderHandler(reverseGeocoder, processInvalidPositions));
}
pipeline.addLast("handler", new TrackerEventHandler(dataManager));
return pipeline;
}
答案 0 :(得分:0)
CLOSE_WAIT表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它执行此操作)。将-p添加到netstat以获取pid,然后更有力地杀死它(如果需要,使用SIGKILL)。那应该摆脱你的CLOSE_WAIT套接字。您也可以使用ps来查找pid。
SO_REUSEADDR适用于服务器和TIME_WAIT套接字,因此不适用于此处。
有关其他回复,请参阅this thread。
检查应用程序代码,检查在处理完客户端会话后是否显式调用所有套接字上的close。
答案 1 :(得分:0)
您的应用程序因未能关闭它们而泄漏套接字。所以关闭他们。他们都是。在最后的块中。当您读取流的结尾或在套接字上获得任何DropDownList
操作时。