netty-socketio,java Socket遇到的坑及解决办法

1、现象:在linux系统服务器上重启Java项目时,socket重启失败。显示端口被占用,但是查询端口的时候并没有发现有占用端口的信息,反复重启后才能重启socket成功。

  原因:经查找,在TCP连接中,socket在重启时断开连接要经过四次握手,这时处于TIME_WAIT状态,所以会占用端口一段时间,大概两到三分钟,所以才会反复重启三四分钟后才会成功

  解决:将socket配置信息设置SO_REUSEADDR关键字为true。这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。java代码如下:

Configuration config = new Configuration();
/**
 * 使用SO_REUSEADDR套接字选项避免地址使用错误
 * 避免等待TIME_WAIT结束
 */
SocketConfig socketConfig = new SocketConfig();
socketConfig.setReuseAddress(true);
config.setSocketConfig(socketConfig);
SocketIOServer server = new SocketIOServer(config);

2、现象:在客户的服务器上,socket一直重复打印Connection reset by peer .java.io.IOException: Connection reset by peer错误。

  原因:这个原因有很多种,网上也有很多种解决办法,几乎都试过了,没有起作用。而且客户服务器保密,这个项目并不是我负责的,连源码也接触不到。最终我给他们的解决方案是:禁用 'connection reset by peer'错误打印

  解决:设置socket配置信息设置ExceptionListener.exceptionCaught为false。Java代码如下:

Configuration config = new Configuration();

// 解决线上环境socket循环打印错误日志
ExceptionListener exceptionListener = new ExceptionListener() {
    @Override
    public void onEventException(Exception e, List args, SocketIOClient client) {
    }

    @Override
    public void onDisconnectException(Exception e, SocketIOClient client) {
    }

    @Override
    public void onConnectException(Exception e, SocketIOClient client) {
    }

    @Override
    public boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception             
    {                             
        return false;
    }
};
config.setExceptionListener(exceptionListener);
SocketIOServer server = new SocketIOServer(config); 
  

暂时就遇到这两个问题。有其他问题再补充。

你可能感兴趣的:(Java,Socket,netty-socketio)