当前位置:   article > 正文

websocket 配置、部署、链接404等问题总结_websocket 404

websocket 404

在我们配置websocket完成之后,测试时发现服务报404;

问题可以分为两个方向去找:
1、配置出现问题导致服务未能正确启动

2、链接地址输错

首先来分析一下第一点:

我是使用@ServerEndpoint注解的方式来实现websocket服务的,使用的框架时SpringMVC或者SpringBoot都可以。

SpringMVC  POM文件和具体代码:

  1. <!--websocketconfig start-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-websocket</artifactId>
  5. <version>{spring.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-messaging</artifactId>
  10. <version>{spring.version}</version>
  11. </dependency>
  12. <!--websocketconfig end-->
  1. package com.yz.robot.api.controller.websocket;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.stereotype.Component;
  8. import javax.websocket.*;
  9. import javax.websocket.server.PathParam;
  10. import javax.websocket.server.ServerEndpoint;
  11. import java.io.IOException;
  12. import java.util.Date;
  13. import java.util.Map;
  14. import java.util.concurrent.ConcurrentHashMap;
  15. /**
  16. * @author AlexZ
  17. */
  18. @ServerEndpoint(value = "/websocket/{userId}")
  19. @Component
  20. public class WebSocketServer {
  21. public static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
  22. //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  23. private static int onlineCount = 0;
  24. //concurrent包的线程安全Map,用来存放每个客户端对应的MyWebSocket对象。
  25. private static ConcurrentHashMap<String,WebSocketServer> webSocketSet = new ConcurrentHashMap<String,WebSocketServer>();
  26. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  27. private Session session;
  28. //当前发消息人员编号
  29. private String sid="";
  30. /**
  31. * 连接建立成功调用的方法*/
  32. @OnOpen
  33. public void onOpen(@PathParam("userId")String userId, Session session) throws IOException {
  34. this.session = session;
  35. this.sid = userId;
  36. boolean flag = true;
  37. for (Map.Entry<String, WebSocketServer> entry : webSocketSet.entrySet()) {//大容量时,性能最优方案
  38. if(entry.getKey().equals(sid)) {
  39. flag = false;
  40. }
  41. }
  42. if(flag == false) {//表示session已经存在该用户
  43. System.out.println("该用户已连接");
  44. }else {
  45. webSocketSet.put(userId,this); //加入set中
  46. addOnlineCount(); //在线数加1
  47. System.out.println("有新连接加入!当前在线人数为" + getOnlineCount() + ",当前登陆者为ID:" + this.session.getId() + ",当前登陆者为name:" + sid);
  48. }
  49. }
  50. /**
  51. * 连接关闭调用的方法
  52. */
  53. @OnClose
  54. public void onClose(@PathParam("userId")String userId) {
  55. webSocketSet.remove(userId); //从set中删除
  56. subOnlineCount(); //在线数减1
  57. log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  58. }
  59. /**
  60. * 收到客户端消息后调用的方法
  61. *
  62. * @param message 客户端发送过来的消息
  63. * @throws IllegalAccessException
  64. * @throws */
  65. @OnMessage
  66. public void onMessage(String message, Session session) throws IOException, IllegalAccessException {
  67. log.info("收到来自窗口"+sid+"的信息:"+message);
  68. JSONObject jsonObject = JSON.parseObject(message);
  69. insert2Message(message);
  70. }
  71. /**
  72. * 自定义发送消息
  73. * @throws IllegalAccessException
  74. * @throws
  75. * */
  76. public void sendInfo(String message) throws IOException, IllegalAccessException {
  77. log.info("收到来自窗口的信息:"+message);
  78. insert2Message(message);
  79. }
  80. /**
  81. *
  82. * @param session
  83. * @param error
  84. */
  85. @OnError
  86. public void onError(Session session, Throwable error) {
  87. log.error("发生错误");
  88. error.printStackTrace();
  89. }
  90. public void sendMessage(String message) throws IOException {
  91. this.session.getBasicRemote().sendText(message);
  92. }
  93. public static synchronized int getOnlineCount() {
  94. return onlineCount;
  95. }
  96. public static synchronized void addOnlineCount() {
  97. WebSocketServer.onlineCount++;
  98. }
  99. public static synchronized void subOnlineCount() {
  100. WebSocketServer.onlineCount--;
  101. }
  102. private void insert2Message(String message) throws IOException, IllegalAccessException {
  103. //返回的信息
  104. JSONObject jsonObject = JSON.parseObject(message);
  105. String receiverId = jsonObject.getString("receiverId");
  106. try {
  107. if(webSocketSet.get(receiverId) != null) {//没有session则不做操作
  108. //发送
  109. webSocketSet.get(receiverId).sendMessage(message);
  110. }
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. }

注意点:websocketserver相当于服务器,我们需要好将这个类放到controller层中,如果我们放到service层中还是会出现404问题。

SpringBoot  基本与上面一致,如果不行需要加一个配置文件代码如下:

  1. package com.hzys.config.webSocket;
  2. import com.hzys.core.service.webSocket.WebSocketServer;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.messaging.simp.config.MessageBrokerRegistry;
  7. import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
  8. import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
  9. import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
  10. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  11. /**
  12. * @author AlexZ
  13. *
  14. */
  15. @Configuration
  16. public class WebSocketConfig{
  17. @Bean
  18. public ServerEndpointExporter serverEndpointExporter()
  19. {
  20. return new ServerEndpointExporter();
  21. }
  22. }

注意点SpringMVC不需要这个配置,SpringBoot使用内置容器时使用。

按照以上配置第一点问题算是解决了。

接下来是第二点链接地址输入错误:

一般在本地启动使用ws://localhost:8080/websocket/{userId}

都可以正常启动其中注意点是  端口号与tomcat一致,端口号8080与websocket之间是不是需要加项目名(和自己配置有关)

保证如上注意点正确,即可链接成功!

但是我们将项目部署到自己的linux或者阿里云上,又报404

这里我们检查的东西和上面说的是一样的,但是要特别注意端口号,因为有的项目会使用nginx将正真的tomcat端口号隐藏起来,这里我们是需要正真的tomcat端口号。

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

闽ICP备14008679号