当前位置:   article > 正文

建立websocket连接并发送和处理数据_websocket传输数据

websocket传输数据

服务端

1、WebSocket配置类

在配置类中一般需要实现“注册WebSocket处理程序”、“Bean注册”。

  1. @Configuration
  2. @EnableWebSocket//启用WebSocket功能
  3. public class WebSocketConfig implements WebSocketConfigurer {
  4. @Override
  5. public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  6. registry.addHandler(myWebSocketHandler(), "/chat")
  7. //将WebSocket处理程序注册到指定的路径
  8. .addInterceptors(new HandshakeInterceptor() {
  9. public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
  10. ServletServerHttpRequest request = (ServletServerHttpRequest)serverHttpRequest;
  11. String username = request.getServletRequest().getParameter("username");
  12. map.put("username", username);
  13. return true;
  14. }//从 HTTP 请求中获取用户名,并将其添加到 WebSocket 握手中的属性 Map 中
  15. });
  16. }
  17. @Bean
  18. public WebSocketHandler myWebSocketHandler() {
  19. return new MyWebSocketHandler();
  20. //创建了一个 WebSocket 处理程序的实例并将其作为 bean 注册到 Spring 上下文中。
  21. //这将使处理程序在需要时自动注入到其他组件中
  22. }
  23. }

 上面的代码首先注册了自定义的 WebSocket 处理程序。在自定义的WebSocket的处理程序中指定了客户端连接的路径;并添加了一个握手拦截器,用来获取HTTP请求的用户名,并将其添加到WebSocket握手中的Map属性中,以便WebSocketHandler 可以通过读取属性映射中的值来访问和使用这些信息。

其次创建了一个 WebSocket 处理程序的实例并将其作为 bean 注册到 Spring 上下文中

2、WebSocketHandler

在正式的处理逻辑中,一般需要实现"连接成功时的逻辑"、"连接失败时的逻辑"、“连接关闭的逻辑”。

  1. public class MyWebSocketHandler implements WebSocketHandler {
  2. //保存所有在线用户的session的集合容器
  3. private static CopyOnWriteArrayList<WebSocketSession> sessions =
  4. new CopyOnWriteArrayList<>();
  5. //保存所有在线用户
  6. private static CopyOnWriteArrayList<String> usernames =
  7. new CopyOnWriteArrayList<>();
  8. ObjectMapper om = new ObjectMapper();//Java 对象和 JSON 数据之间进行序列化和反序列化。
  9. @Override
  10. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  11. // 连接成功时的逻辑
  12. //保存连接的这个人的session和用户名
  13. Map<String, Object> attributes = session.getAttributes();
  14. String username = (String) attributes.get("username");
  15. usernames.add(username);
  16. sessions.add(session);
  17. //发送一个谁谁谁上线了的消息给所有人
  18. Chat chat = new Chat(username,"上线了",1);
  19. String jsonStr = om.writeValueAsString(chat);
  20. //转发数据给所有人
  21. sendAll(jsonStr);
  22. //发送所有用户在线列表
  23. jsonStr = om.writeValueAsString(usernames);
  24. sendAll(jsonStr);
  25. }
  26. //向所有已连接websocket的客户端发消息
  27. private void sendAll(String jsonStr) throws IOException{
  28. for(WebSocketSession session: sessions){
  29. if(session.isOpen()){
  30. session.sendMessage(new TextMessage(jsonStr));
  31. }
  32. }
  33. }
  34. @Override
  35. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
  36. // 处理消息的逻辑
  37. String username = (String) session.getAttributes().get("username");
  38. Chat msg = null;
  39. // 处理文本消息
  40. String msgStr = message.getPayload().toString();
  41. if("\0".equals(msgStr)){
  42. msg =new Chat(username,"发送了一个窗口抖动",5);
  43. }else if (msgStr.startsWith("\1")){
  44. String messageId = msgStr.substring(1);//从第一个位置开始截取,第0个位置是\1
  45. msg = new Chat(username,"撤回了一条消息",6,messageId);
  46. }else{
  47. String msgT = msgStr.substring(1);
  48. msg = new Chat(username,msgT,4, UUID.randomUUID().toString());
  49. System.out.println("文本消息");
  50. System.out.println(msgT);
  51. }
  52. String jsonStr = om.writeValueAsString(msg);
  53. sendAll(jsonStr);
  54. }
  55. @Override
  56. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  57. // 处理连接失败时的逻辑
  58. }
  59. @Override
  60. public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
  61. // 连接关闭时的逻辑
  62. String username = (String) session.getAttributes().get("username");
  63. //移除这个session
  64. sessions.remove(session);
  65. usernames.remove(username);
  66. Chat message = new Chat("系统消息",username+"下线了",1);
  67. String jsonStr = om.writeValueAsString(message);
  68. sendAll(jsonStr);
  69. jsonStr = om.writeValueAsString(usernames);
  70. sendAll(jsonStr);
  71. }
  72. }

上面的代码中:

1)连接成功的逻辑;首先保存了连接WebSocket服务器客户端的session以及用户名;然后将用户上线消息广播到了连接这个WebSocket服务器的所有客户端;并且刷新群聊用户在线用户列表。

其次定义了客户端如何与WebSocket交互的逻辑,识别传输消息的第一个字符,做出相应包装处理,广播给所有客户端

2)连接失败的逻辑;未定义

3)连接关闭的逻辑;移除客户端session以及将用户名从用户列表中删除并发送下线消息。

另外将消息广播到所有连接客户端的逻辑独立出来复用

前端

在js代码中,同样应该首先向WebSocket服务器建立逻辑,然后再定义“连接成功的逻辑”、“连接失败的逻辑”、“连接关闭的逻辑”。

  1. var username = $("#username").val();
  2. //window.location.host代表获取ip:port
  3. var url = "ws://" + window.location.host + "/chat?username=" + username;
  4. //与后台建立websocket长连接
  5. // alert(url);
  6. var ws = new WebSocket(url);
  7. ws.onopen = function () {
  8. //处理成功时的逻辑
  9. console.log("成功")
  10. };
  11. ws.onmessage = function (e) {
  12. //处理消息的逻辑
  13. var message = JSON.parse(e.data);
  14. console.log("成功+1")
  15. //alert(message.type);
  16. //alert(message.content);
  17. if (!message.type){
  18. onlineUser(message);
  19. }else if (message.type == 1) {
  20. //系统上线消息
  21. systemOnlineMessage(message);
  22. }else if(message.type == 4){
  23. //用户文本消息
  24. userTextMessage(message);
  25. }else if(message.type == 5){
  26. // 收到用户抖动消息
  27. dydMessage(message);
  28. }else if(message.type == 6){
  29. //用户撤销消息
  30. withdrawMessage(message);
  31. }else if(message.type == 7){
  32. userImageMessage(message);
  33. }
  34. ws.onclose = function(event) {
  35. // 连接关闭时的逻辑
  36. }
  37. /*滚动条滑到最底部*/
  38. $("#record").scrollTop(9999999);
  39. };

具体函数实现代码未给出,代码使了的jquery库

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号