如何在Java中重新连接WebSocket?

6

我有一个简单的Java WebSocket客户端。有时候与WebSocket服务器的连接会丢失。如果连接丢失,如何进行自动重新连接?

import javax.websocket.*;
import java.net.URI;

@ClientEndpoint
public class WebsocketClientEndpoint {

Session userSession = null;

public WebsocketClientEndpoint(URI endpointURI) {
    try {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, endpointURI);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

@OnOpen
public void onOpen(Session userSession) {
    System.out.println("Opening websocket");
    this.userSession = userSession;
}

@OnClose
public void onClose(Session userSession, CloseReason reason) {
    System.out.println("Closing websocket");
    this.userSession = null;
}

@OnMessage
public void onMessage(String message) {
    System.out.println("Received message: "+ message);
}

public void sendMessage(String message) {
    this.userSession.getAsyncRemote().sendText(message);
}
}

测试应用

import java.net.URI;
import java.net.URISyntaxException;
public class TestApp {

public static void main(String[] args) {
    try {
        final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("ws://localhost:8080/websocket/api"));

        while (true) {
            Thread.sleep(30000);
        }

    } catch (Exception ex) {
        System.err.println("Exception: " + ex.getMessage());
    }
}
}

在Java中有一个简单的WebSocket客户端和测试类。有时候连接到WebSocket服务器可能会断开。如果连接丢失,如何实现自动重新连接?

2个回答

2

Reconnect 不是 WebSocket JSR 356 Specs 的一部分,必须通过编写特定的逻辑来实现。

但是,您可以使用客户端库,如 'Tyrus',它具有 ReconnectHandler。 基本上,这有 APIS 来捕获事件,如 onDisconnect,onConnectFailure,可用于重新连接。

请参阅此链接以了解如何使用它:Tyrus Reconnect Handler

API Doc Here


Tyrus 重新连接处理程序的链接已失效。 - levios

1

正如TechFree所指出的那样,重新连接并不是JSR 356规范的一部分。实际上,这个实现是有意为之的。原因在于套接字连接的编写方式可以经受住原子弹的摧毁。

如上所述,由于各种原因,主要是由于网络、服务器端问题、协议违规或安全问题,与服务器的连接可能会丢失。

因此,我们唯一的选择是创建一个新的连接到服务器并使用它进行通信。现在假设有一种情况,即由于服务器端或网络问题无法建立连接,那么我们需要一种最大重试的逻辑来限制连接创建,然后放弃。

现在假设在某个时间T,您的服务器能够建立连接(恢复后),那么它需要通知客户端相关信息。(或编写一些客户端逻辑,在一定时间间隔后尝试连接)

总之,当涉及到Websockets时,没有捷径可以编写足够多的代码来处理重新连接和重试逻辑。希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接