我有一个简单的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条答案
按热度按时间1aaf6o9v1#
重新连接不是WebSocket JSR 356 Specs的一部分,必须通过编写特定的逻辑来实现。
但是,您可以使用具有ReconnectHandler的客户端库,如“Tyrus”。基本上,它有APIS来捕获onDisconnect,onConnectFailure等事件,这些事件可以用于重新连接。
请参阅此链接了解如何使用它:Tyrus Reconnect Handler
API Doc Here
efzxgjgh2#
正如TechFree所指出的,重新连接不是JSR 356规范的一部分。实际上,这种实施是故意的。原因是套接字连接的编写方式可以在原子弹的破坏中幸存下来。
如上所述,与服务器的连接可能由于过多的原因而丢失,主要是由于网络、服务器端问题、协议违反或安全问题。
所以我们剩下的唯一选择就是创建一个到服务器的新连接并使用它进行通信。现在假设可能存在由于服务器端或网络问题而无法建立连接的情况,那么我们将需要一种最大重试类型的逻辑,该逻辑在放弃之前限制连接创建。
现在假设在某个时间假设T,您的服务器能够建立连接(恢复后),那么它需要通知客户端有关相同的信息。(或者编写一些客户端逻辑,在一段时间后尝试连接)
总而言之,对于Websockets,要编写大量的代码来处理重新连接和重试逻辑,没有捷径可走。希望这能帮上忙。