当前位置:   article > 正文

WebSocket案例(二) 服务端_websocket服务端

websocket服务端

  文章目录

前言

WebSocket服务器的功能实现

1. 导入依赖

2. 编写WebSocket的配置类       

3. 自定义WebSocket的服务类

3.1 创建服务类

3.2 定义服务类中对应的事件方法

3.3 服务类的完整代码

总结


前言

         本文将在Spring boot框架下,创建一个web项目来实现WebSocket服务器的功能。

WebSocket服务器的功能实现

1. 导入依赖

         项目是基于spring boot框架构建的,导入其中的WebSocket自动装配依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-websocket</artifactId>
  4. <version>2.7.3</version>
  5. </dependency>

2. 编写WebSocket的配置类       

        在创建WebSocket服务类之前,需要为其编写一个配置类,配置类中使用@Bean注解将ServerEndpointExporter 对象,也就是服务端点导出器对象交给IOC容器管理,这又这样,spring boot web工程才能识别WebSocket服务类。

  1. package com.example.websocket;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  5. /**
  6. * WebSocket配置类,用于注册WebSocket的Bean
  7. */
  8. @Configuration
  9. public class WebSocketConfiguration {
  10. @Bean
  11. public ServerEndpointExporter serverEndpointExporter() {
  12. return new ServerEndpointExporter();
  13. }
  14. }

3. 自定义WebSocket的服务类

3.1 创建服务类

        创建服务类只需要打上两个注解。

        注解一:@Component 表示该类是IOC容器的组件,将该类交给IOC容器管理。

        注解二:@ServerEndpoint 表示该类是WebSocket的服务类,参数为访问时的映射地址。

  1. /**
  2. * WebSocket服务
  3. */
  4. @Component
  5. @ServerEndpoint("/webSocketServer")
  6. public class WebSocketServer {
  7. }

3.2 定义服务类中对应的事件方法

        WebSocket中有4个事件分别是open、message、error、close,他们也对应着4个注解。

3.2.1 @OnOpen

        表示连接成功时使用的方法。可以在方法参数上接收一个会话对象,让每一个建立连接的客户端都保存起来,方便后期往客户端发送数据。

  1. //存放会话对象
  2. private static List<Session> sessionList = new ArrayList<>();
  3. @OnOpen
  4. public void onOpen(Session session) {
  5. System.out.println("客户端建立连接");
  6. sessionList.add(session);
  7. }

3.2.2 @OnMessage

        收到客户端发来消息时执行的方法。这里自定义了一个群发消息的方法,用于个所有连接的客户端发送消息。通过之前保存的会话对象的getBasicRemote()方法来获取一个远程服务端点对象,然后使用这个对象的sendText方法发送一个字符串对象个客户端。

        通过使用getBasicRemote()获取的对象来发送信息,最主要的原因是其特点是阻塞式发送信息。

        还可以使用getAsyncRemote()获取对象来发送信息,其特点是异步式发送。

  1. /**
  2. * 收到客户端消息后调用的方法
  3. *
  4. * @param message 客户端发送过来的消息
  5. */
  6. @OnMessage
  7. public void onMessage(String message) {
  8. System.out.println("收到来自客户端的信息:" + message);
  9. sendToAllClient(message);
  10. }
  11. /**
  12. * 群发
  13. *
  14. * @param message 需要发送的信息
  15. */
  16. public void sendToAllClient(String message) {
  17. for (Session session : sessionList) {
  18. try {
  19. //服务器向客户端发送消息
  20. //getBasicRemote()方法是获取一个远程服务端点对象,通过该对象进行阻塞式的信息传输
  21. session.getBasicRemote().sendText(message);
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

3.2.3 @OnError

        连接出错时调用的方法

  1. @OnError
  2. public void OnError() {
  3. System.out.println("连接出错");
  4. }

3.2.3 @OnClose

        连接关闭时调用的方法

  1. @OnError
  2. public void OnError() {
  3. System.out.println("连接出错");
  4. }

3.3 服务类的完整代码

  1. package com.example.websocket;
  2. import org.springframework.stereotype.Component;
  3. import javax.websocket.*;
  4. import javax.websocket.server.PathParam;
  5. import javax.websocket.server.ServerEndpoint;
  6. import java.util.*;
  7. /**
  8. * WebSocket服务
  9. */
  10. @Component
  11. @ServerEndpoint("/webSocketServer")
  12. public class WebSocketServer {
  13. //存放会话对象
  14. private static List<Session> sessionList = new ArrayList<>();
  15. /**
  16. * 连接建立成功调用的方法
  17. */
  18. @OnOpen
  19. public void onOpen(Session session) {
  20. System.out.println("客户端建立连接");
  21. sessionList.add(session);
  22. }
  23. /**
  24. * 收到客户端消息后调用的方法
  25. *
  26. * @param message 客户端发送过来的消息
  27. */
  28. @OnMessage
  29. public void onMessage(String message) {
  30. System.out.println("收到来自客户端的信息:" + message);
  31. sendToAllClient(message);
  32. }
  33. /**
  34. * 群发
  35. *
  36. * @param message 需要发送的信息
  37. */
  38. public void sendToAllClient(String message) {
  39. for (Session session : sessionList) {
  40. try {
  41. //服务器向客户端发送消息
  42. //getBasicRemote()方法是获取一个远程服务端点对象,通过该对象进行阻塞式的信息传输
  43. session.getBasicRemote().sendText(message);
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. /**
  50. * 连接关闭调用的方法
  51. */
  52. @OnClose
  53. public void onClose() {
  54. System.out.println("连接断开");
  55. }
  56. /**
  57. * 连接出错调用的方法
  58. */
  59. @OnError
  60. public void OnError() {
  61. System.out.println("连接出错");
  62. }
  63. }

总结

        WebSocket服务端的实现已经完成,文中的服务端可以结合 WebSocket案例(一) 客户端_C.J.Y的博客-CSDN博客 中的客户端进行测试,只需要将编写客户端的html文件加入到项目中的src/main/resources/statis目录下(如下图),然后启动项目,访问localhost:8080/文件名.html 即可进行页面测试。

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

闽ICP备14008679号