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

1 篇文章 0 订阅
1 篇文章 0 订阅

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<Object> 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);

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值