当前位置:   article > 正文

微服务下不同Websocket Java工具类,服务端和客户端的代码实现_java websocket客户端

java websocket客户端

大家好,我是程序员大猩猩。

大家都知道,在程序开发期间,websocket接口是某些程序必不可少的一环。但是websocket跟我们平时开发api又不是系统,有时候我们可以使用Spring自带的websocket框架来实现,有时候又觉得使用其他框架更为便利和高效,那么我在此就给大家介绍一下我们常用的几种websocket实现。

1. Springboot内置websocket

内置websocket是我们经常使用,而且是非常广泛使用的。内置包括基本的websocket创建,而且包含sockJS的实现,以下我们只实现基础的websocket的开发。

首先pom.xml导入websocket starter

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-websocket</artifactId>
  4. </dependency>a. 内置websocket服务端

新建一个类,注册服务端点,使spring服务知道我们要创建一个websocket端点服务。

  1. @Configuration
  2. public class WebSocketConfig {
  3. /**
  4. * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
  5. */
  6. @Bean
  7. public ServerEndpointExporter serverEndpointExporter() {
  8. return new ServerEndpointExporter();
  9. }
  10. }

之后,就是实现socket服务了。

  1. @Slf4j
  2. @ServerEndpoint(value = "/ws/....")
  3. @Component
  4. public class WebSocketServer {
  5. // 连接
  6. @OnOpen
  7. public void onOpen(Session session){}
  8. // 关闭
  9. @OnClose
  10. public void onClose(Session session){}
  11. // 发生错误
  12. @OnError
  13. public void onError(Session session, Throwable e) {}
  14. // 收到客户端消息
  15. @OnMessage
  16. public void onMessage(String json, Session session){}
  17. // 广播消息
  18. public <T> void sendAllMessage(T t) throws Exception {
  19. for (WebSocketServer item : webSocketSet) {
  20. log.info("【websocket消息】广播消息:" + t);
  21. synchronized (item.session) {
  22. item.session.getBasicRemote().sendText(JSON.toJSONString(t));
  23. }
  24. }
  25. }
  26. // 点对点消息发送
  27. public <T> void sendOneMessage(String sessionId, T t) throws Exception {
  28. log.info("开始发送消息 " + sessionMap + ": " + sessionId);
  29. Session session = sessionMap.get(sessionId);
  30. if (session != null) {
  31. try {
  32. log.info("【websocket消息】单点消息:" + sessionId);
  33. session.getAsyncRemote().sendText(t.toString());
  34. } catch (Exception e) {
  35. log.info("异常信息:{}", e.toString());
  36. }
  37. } else {
  38. log.info("获取不到session,发送消息失败" + sessionMap);
  39. }
  40. }
  41. }
  • b.内置websocket客户端
  1. @Configuration
  2. public class WebSocketClientConfig {
  3. @Bean
  4. public WebSocketConnectionManager webSocketConnectionManager() {
  5. WebSocketHandler handler = new WebSocketHandler() {
  6. @Override
  7. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  8. // 连接建立后的操作
  9. }
  10. @Override
  11. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  12. // 处理传输错误的操作
  13. }
  14. @Override
  15. public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
  16. // 连接关闭后的操作
  17. }
  18. @Override
  19. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
  20. // 处理接收到的消息的操作
  21. }
  22. };
  23. WebSocketConnectionManager manager = new WebSocketConnectionManager(new StandardWebSocketClient(), handler, "ws://localhost:8080/ws/...");
  24. manager.setAutoStartup(true);
  25. return manager;
  26. }
  27. }

2. 使用Java-WebSocket实现

Java-WebSocket 是一个开源的、轻量级的WebSocket客户端和服务器库,它遵循Java API规范(JSR 356)来实现WebSocket协议。这个库允许开发者轻松地在Java应用程序中实现WebSocket通信,而不必关心底层的网络细节。

照旧pom.xml导入组件工具包

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

a. Java-Websocket服务端

  1. @Slf4j
  2. public class WebSocketServer extends WebSocketServer {
  3. public MyWebSocketServer(int port) {
  4. super(new InetSocketAddress(port));
  5. }
  6. @Override
  7. public void onOpen(WebSocket conn, ClientHandshake handshake) {
  8. log.info("新的连接: " + conn.getRemoteSocketAddress());
  9. }
  10. @Override
  11. public void onClose(WebSocket conn, int code, String reason, boolean remote) {
  12. log.info("连接关闭: " + conn.getRemoteSocketAddress());
  13. }
  14. @Override
  15. public void onMessage(WebSocket conn, String message) {
  16. log.info("收到消息: " + message);
  17. conn.send("你发送的是: " + message);
  18. }
  19. @Override
  20. public void onError(WebSocket conn, Exception ex) {
  21. ex.printStackTrace();
  22. }
  23. public static void main(String[] args) {
  24. // 选择一个端口号
  25. int port = 8887;
  26. MyWebSocketServer server = new MyWebSocketServer(port);
  27. server.start();
  28. log.info("服务器启动在端口: " + port);
  29. }
  30. }

b. Java-Websocket客户端

  1. public class WebSocketClient extends WebSocketClient {
  2. public MyWebSocketClient(URI serverUri) {
  3. super(serverUri);
  4. }
  5. @Override
  6. public void onOpen(ServerHandshake handshakedata) {
  7. System.out.println("连接开启");
  8. send("Hello, Server!"); // 向服务器发送消息
  9. }
  10. @Override
  11. public void onMessage(String message) {
  12. System.out.println("收到消息: " + message);
  13. }
  14. @Override
  15. public void onClose(int code, String reason, boolean remote) {
  16. System.out.println("连接关闭: " + reason);
  17. }
  18. @Override
  19. public void onError(Exception ex) {
  20. ex.printStackTrace();
  21. }
  22. public static void main(String[] args) {
  23. try {
  24. WebSocketClient client = new MyWebSocketClient(new URI("ws://localhost:8887"));
  25. client.connect();
  26. } catch (URISyntaxException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

3. 使用okhttp3实现

okhttp3应该是在android端实现的利器,虽然本人不具备android原生的开发,但是接触okhttp3之后,感觉它应该也是一个非常好的通信框架。而且它也支持socket开发。

但是,我们要知道okhttp3是不提供websocket服务端创建的。

  1. <dependency>
  2. <groupId>com.squareup.okhttp3</groupId>
  3. <artifactId>okhttp</artifactId>
  4. <version>4.9.3</version>
  5. </dependency>

okhttp3客户端实现

  1. public class OkHttpWebSocketClient {
  2. private final OkHttpClient client = new OkHttpClient();
  3. public void start() {
  4. Request request = new Request.Builder()
  5. .url("ws://localhost:8080/ws/...")
  6. .build();
  7. WebSocketListener webSocketListener = new WebSocketListener() {
  8. @Override
  9. public void onOpen(WebSocket webSocket, Response response) {
  10. System.out.println("WebSocket opened");
  11. // 连接打开后发送消息
  12. webSocket.send("Hello, Server!");
  13. }
  14. @Override
  15. public void onMessage(WebSocket webSocket, String text) {
  16. System.out.println("Received message: " + text);
  17. }
  18. @Override
  19. public void onClosing(WebSocket webSocket, int code, String reason) {
  20. System.out.println("WebSocket closing: " + reason);
  21. }
  22. @Override
  23. public void onFailure(WebSocket webSocket, Throwable t, Response response) {
  24. t.printStackTrace();
  25. }
  26. };
  27. client.newWebSocket(request, webSocketListener);
  28. }
  29. public static void main(String[] args) {
  30. new OkHttpWebSocketClient().start();
  31. }
  32. }

4. 使用Jetty时限

Jetty是一个开源的、基于Java的HTTP服务器和Servlet容器。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.eclipse.jetty.websocket</groupId>
  4. <artifactId>websocket-server</artifactId>
  5. <version>9.4.43.v20210629</version>
  6. </dependency>
  7. </dependencies>

a. Jetty服务端

首先我们需要设置一个websocket的端点

  1. @Slf4j
  2. @WebSocket
  3. public class MyWebSocketEndpoint {
  4. @OnWebSocketConnect
  5. public void onConnect(Session session) throws Exception {
  6. log.info("New connection: " + session.getRemoteAddress().getAddress());
  7. session.getRemote().sendString("Hello, Client!");
  8. }
  9. @OnWebSocketMessage
  10. public void onMessage(Session session, String message) throws Exception {
  11. log.info("Received message: " + message);
  12. session.getRemote().sendString("You said: " + message);
  13. }
  14. @OnWebSocketClose
  15. public void onClose(int statusCode, String reason) {
  16. log.info("Connection closed: " + reason);
  17. }
  18. }

然后我们在启动服务时,启动socket端点

  1. Server server = new Server(8080);
  2. ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
  3. context.setContextPath("/");
  4. server.setHandler(context);
  5. ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);
  6. wscontainer.addEndpoint(MyWebSocketEndpoint.class);
  7. server.start();
  8. server.join();

b. Jetty客户端

设置端点

  1. @Slf4j
  2. @WebSocket
  3. public class MyWebSocketClientEndpoint {
  4. @OnWebSocketConnect
  5. public void onConnect(Session session) throws Exception {
  6. log.info("Connected to server");
  7. session.getRemote().sendString("Hello, Server!");
  8. }
  9. @OnWebSocketMessage
  10. public void onMessage(String message) {
  11. log.info("Received message: " + message);
  12. }
  13. @OnWebSocketClose
  14. public void onClose(int statusCode, String reason) {
  15. log.info("Connection closed: " + reason);
  16. }
  17. }

连接服务端

  1. public class JettyWebSocketClient {
  2. public static void main(String[] args) throws Exception {
  3. WebSocketClient client = new WebSocketClient();
  4. try {
  5. client.start();
  6. URI uri = new URI("ws://localhost:8080/myWebSocketEndpoint");
  7. ClientEndpointConfig config = ClientEndpointConfig.Builder.create().build();
  8. Session session = client.connectToServer(new MyWebSocketClientEndpoint(), config, uri);
  9. // 等待连接关闭
  10. session.getCloseFuture().get();
  11. } finally {
  12. client.stop();
  13. }
  14. }
  15. }

以上四种工具类连接方式应该是我们经常用到的,但是不防我们程序员大神开源了很多websocket库,并且很好用。

假如有好用的可以给我留言,大家一起探讨使用,谢谢。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/884047
推荐阅读
相关标签
  

闽ICP备14008679号