云鬓花颜 2023-12-01 23:01 采纳率: 100%
浏览 8
已结题

java websocket 自动断开 code 1006

两台 腾讯云服务器 一台香港 一台新加坡 新加披服务器部署java netty服务 用于采集数据到本机 然后 香港服务器 使用java websocket连接新加坡服务器 用于定时拉取数据 有心跳机制 能够正常运行 两个小时后 就自动断开 code 1006 没有原因内容 也有重连机制处理 一旦出现code 1006 后面在怎么重连都连接不上 请问怎么回事

香港websocket代码:

class ForeignEventProcessWebSocket extends WebSocketClient {
    
    @Override
    public void onClose(int code, String reason, boolean remote) {
        log.error(" --- 采集-外汇-ws-异常关闭 ! code: " + code + "reason: " + reason + "remote: " + reason);
        reconnect();
    }

    @Override
    public void onError(Exception ex) {
        log.error(" --- 采集-外汇-ws-错误!");
        log.error(ex.getMessage(), ex);
    }

    public void reconnect() {
        URI uri = null;
        try {
            uri = new URI(SpringUtil.getProperty("gather"));
            ForeignEventProcessWebSocket liveDataWebSocket = new ForeignEventProcessWebSocket(uri);
            WebSocketClient socketClient = ForeignExchangeClient.SOCKET_CLIENT_MAP.get("foreignExchangeSocket");
            if (socketClient != null) {
                socketClient.close();
            }
            ForeignExchangeClient.SOCKET_CLIENT_MAP.put("foreignExchangeSocket", liveDataWebSocket);
            liveDataWebSocket.connect();
        } catch (Exception e) {
            log.error(" --- 采集-外汇-ws-重连失败!!!", e);
        }
    }

    public ForeignEventProcessWebSocket(URI serverUri) {
        super(serverUri);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        sendConnectBd();
    }

    private void sendPong() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("command", GatherCommand.HeartbeatResp.getValue());
        send(jsonObject.toJSONString());
    }

日志一直打印:重连失败!


[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:49:21.309 ERROR 24009 [Timer-44] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:51:21.387 ERROR 24009 [Timer-45] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:53:21.457 ERROR 24009 [Timer-46] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:55:21.530 ERROR 24009 [Timer-47] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:57:21.611 ERROR 24009 [Timer-48] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 22:59:21.689 ERROR 24009 [Timer-49] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote: 
[foreign-exchange-data-172.19.0.10-8020] 2023-12-01 23:01:21.760 ERROR 24009 [Timer-50] com.foreign.exchange.gather.ForeignEventProcessWebSocket  --- 采集-外汇-ws-异常关闭 ! code: 1006reason: remote:

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-02 08:30
    关注

    【以下回答由 GPT 生成】

    问题解答:

    首先,确保网络环境稳定并且没有过多的网络延迟或丢包,可以通过使用ping命令测试网络连通性和延迟情况。例如,可以在控制台输入以下命令:

    ping <服务器IP>
    

    其中,<服务器IP>是新加坡服务器的IP地址。通过这个命令可以检查是否有丢包或延迟。

    如果网络环境没有问题,那么可能是连接超时的设置或其他配置问题。请确保以下几点:

    1. 检查新加坡服务器和香港服务器上的防火墙设置是否允许WebSocket连接通过。检查防火墙规则或配置文件,确保WebSocket的端口能够被访问。
    2. 检查新加坡服务器和香港服务器上是否设置了连接超时的参数。如果设置了过短的连接超时时间,可能导致连接断开。可以在服务端的代码中查找设置连接超时的地方,并适当调整超时时间,例如将其设置为更长的时间。
    3. 检查新加坡服务器和香港服务器上的网络设备(如路由器)是否存在连接超时的设置。如果设置了过短的连接超时时间,可能会导致连接断开。可以查阅设备的文档或保留商咨询相关的设置方法。
    4. 检查新加坡服务器和香港服务器的操作系统网络配置,确定是否有连接保活(keep-alive)的设置。连接保活可以确保空闲连接不会被关闭。可以通过修改操作系统的配置文件或运行一些特定的命令来开启连接保活功能。

    如果以上步骤都没有解决问题,可以尝试在Java WebSocket客户端代码中添加一些代码来处理异常和重连。以下是一个示例代码:

    import java.net.URI;
    import java.util.concurrent.TimeUnit;
    
    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;
    
    public class MyWebSocketClient extends WebSocketClient {
        private static final int RECONNECT_INTERVAL = 10; // 重连间隔,单位为秒
    
        public MyWebSocketClient(URI serverUri) {
            super(serverUri);
        }
    
        @Override
        public void onOpen(ServerHandshake handshakedata) {
            // 连接建立时的处理逻辑
            System.out.println("连接已建立");
        }
    
        @Override
        public void onMessage(String message) {
            // 接收到消息时的处理逻辑
            System.out.println("收到消息:" + message);
        }
    
        @Override
        public void onClose(int code, String reason, boolean remote) {
            // 连接关闭时的处理逻辑
            System.out.println("连接已关闭,code:" + code + ",reason:" + reason);
    
            // 重连逻辑
            try {
                TimeUnit.SECONDS.sleep(RECONNECT_INTERVAL);
                this.connect();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onError(Exception ex) {
            // 发生错误时的处理逻辑
            System.out.println("出现错误:" + ex.getMessage());
        }
    }
    

    使用上述示例代码替换您提供的WebSocket客户端代码,然后确保在创建WebSocket连接时使用这个新的客户端。示例代码中,在连接关闭后会等待一段时间(RECONNECT_INTERVAL),然后再次尝试连接。

    希望这些解决方案可以帮助您解决问题。如果还有其他疑问或需要进一步的帮助,请随时回复。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 已采纳回答 12月4日
  • 修改了问题 12月1日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址