Java WebSocket客户端

痛定思痛。 2024-03-22 11:54 142阅读 0赞

Java WebSocket客户端

方式一 使用Java-WebSocket

1.依赖

  1. <dependency>
  2. <groupId>org.java-websocket</groupId>
  3. <artifactId>Java-WebSocket</artifactId>
  4. <version>1.5.3</version>
  5. </dependency>

2.代码

  1. import org.java_websocket.client.WebSocketClient;
  2. import org.java_websocket.handshake.ServerHandshake;
  3. import java.net.URI;
  4. import java.net.URISyntaxException;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.ScheduledExecutorService;
  7. import java.util.concurrent.TimeUnit;
  8. /**
  9. * @author zhong
  10. */
  11. public class MyWebSocketClient extends WebSocketClient {
  12. public MyWebSocketClient(URI serverUri) {
  13. super(serverUri);
  14. }
  15. @Override
  16. public void onOpen(ServerHandshake data) {
  17. System.out.println("WebSocket连接已打开。");
  18. }
  19. @Override
  20. public void onMessage(String message) {
  21. System.out.println("收到消息: " + message);
  22. }
  23. @Override
  24. public void onClose(int code, String reason, boolean remote) {
  25. System.out.println("WebSocket连接已关闭。");
  26. }
  27. @Override
  28. public void onError(Exception ex) {
  29. System.err.println("WebSocket连接发生错误:" + ex.getMessage());
  30. }
  31. /**
  32. * 连接定时检查
  33. */
  34. public void startReconnectTask(long delay,
  35. TimeUnit unit) {
  36. System.out.println("WebSocket 心跳检查");
  37. // 以下为定时器,建议使用自定义线程池,或交给框架处理(spring)
  38. ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
  39. executorService.scheduleWithFixedDelay(() -> {
  40. // 检查逻辑:判断当前连接是否连通
  41. if (!this.isOpen()) {
  42. System.out.println("WebSocket 开始重连......");
  43. // 重置连接
  44. this.reconnect();
  45. // 以下为错误示范
  46. //this.close();
  47. //this.connect();
  48. }
  49. }, 0, delay, unit);
  50. }
  51. // 测试
  52. public static void main(String[] args) throws URISyntaxException {
  53. // 服务地址
  54. URI uri = new URI("ws:服务地址");
  55. // 创建客户端
  56. MyWebSocketClient myWebSocketClient = new MyWebSocketClient(uri);
  57. // 建立连接
  58. myWebSocketClient.connect();
  59. // 开启 定时检查
  60. myWebSocketClient.startReconnectTask(5, TimeUnit.SECONDS);
  61. }
  62. }

方式二 spring-boot-starter-websocket

1.依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-websocket</artifactId>
  13. </dependency>

2.代码

2.1 自定义 websocket handler

  1. public class ClientWebSocketHandler implements WebSocketHandler {
  2. public static final Logger logger = LoggerFactory.getLogger(ClientWebSocketHandler.class);
  3. @Override
  4. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  5. logger.info("客户端连接成功:{}", session.getId());
  6. }
  7. @Override
  8. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
  9. logger.info("客户端接受到消息:{}", message.getPayload());
  10. }
  11. @Override
  12. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  13. logger.info("客户端发送错误:{}", exception.getMessage());
  14. }
  15. @Override
  16. public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
  17. logger.info("客户端关闭连接:{}", closeStatus.getCode());
  18. }
  19. @Override
  20. public boolean supportsPartialMessages() {
  21. return false;
  22. }
  23. }

2.2 将websocket handler加入容器

  1. @Configuration
  2. public class WebSocketClientConfig {
  3. @Bean
  4. public WebSocketClient webSocketClient() {
  5. return new StandardWebSocketClient();
  6. }
  7. @Bean
  8. public ClientWebSocketHandler clientWebSocketHandler() {
  9. return new ClientWebSocketHandler();
  10. }
  11. @Bean
  12. public WebSocketConnectionManager connectionManager() {
  13. WebSocketConnectionManager connectionManager = new WebSocketConnectionManager(
  14. webSocketClient(),
  15. clientWebSocketHandler(),
  16. "连接地址"
  17. );
  18. connectionManager.setAutoStartup(true);
  19. return connectionManager;
  20. }
  21. }

2.3 定时器监控

  1. @EnableScheduling
  2. @SpringBootApplication
  3. public class WebsocketClientApplication {
  4. @Resource
  5. private WebSocketConnectionManager connectionManager;
  6. public static void main(String[] args) {
  7. SpringApplication.run(WebsocketClientApplication.class, args);
  8. }
  9. @Scheduled(fixedRate = 5000)
  10. public void reconnectTask() {
  11. System.out.println("心跳检查");
  12. if(!connectionManager.isConnected()){
  13. System.out.println("重新连接.....");
  14. connectionManager.stop();
  15. connectionManager.start();
  16. }
  17. }
  18. }

发表评论

表情:
评论列表 (有 0 条评论,142人围观)

还没有评论,来说两句吧...

相关阅读