Netty套接字生成Close_wait状态

时间:2016-03-03 16:42:14

标签: java linux sockets tcp netty

我的应用程序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;
}

2 个答案:

答案 0 :(得分:0)

CLOSE_WAIT表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它执行此操作)。将-p添加到netstat以获取pid,然后更有力地杀死它(如果需要,使用SIGKILL)。那应该摆脱你的CLOSE_WAIT套接字。您也可以使用ps来查找pid。

SO_REUSEADDR适用于服务器和TIME_WAIT套接字,因此不适用于此处。

有关其他回复,请参阅this thread

检查应用程序代码,检查在处理完客户端会话后是否显式调用所有套接字上的close。

答案 1 :(得分:0)

您的应用程序因未能关闭它们而泄漏套接字。所以关闭他们。他们都是。在最后的块中。当您读取流的结尾或在套接字上获得任何DropDownList操作时。