非原创
非原创
非原创
不过还是要记录一下自己被折磨的一晚上。
大部分引用于https://www.cnblogs.com/jmcui/p/8992042.html
还有这个https://www.cnblogs.com/ykqfrost/p/10793740.html
有两种方案可以建立起WebSocket服务
一种是基于Spring 的 spring-websocket,
一种是基于 java 的websocket-api。
这里用到的是spring-websocket
导入pom包
<!--spring-WebSocket的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
建一个符合规范的类
- WebSocketHandler 接口定义了服务端处理WebSocket消息要做的一系列事情。相比直接实现WebSocketHandler,更为简单的方法是扩展AbstractWebSocketHandler,这是WebSocketHandler的一个抽象实现。当然根据处理消息的类型,还可以选择继承TextWebSocketHandler(文本类消息)、BinaryWebSocketHandler(二进制消息)等…
public class mysocket extends AbstractWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) {System.out.println("连接建立");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("接收到消息:" + message.getPayload());
Thread.sleep(2000);
//发送文本消息
session.sendMessage(new TextMessage("Polo!"));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus){
System.out.println("连接关闭");
}
}
建立映射
创建spring-websocket.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket.xsd
">
<!-- websocket处理类 -->
<bean id="myHandler_1" class="controller.test.mysocket " />
<websocket:handlers allowed-origins="*" >
<websocket:mapping path="/NotNeedRoleTest/websocket" handler="myHandler_1"/>
</websocket:handlers>
</beans>
加入spring启动容器
将刚才配置xml的路径
spring-websocket.xml
加入web.xml中
<!--============================启动spring容器=====================================-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:spring-security.xml
classpath:spring-redis.xml
classpath:spring-websocket.xml
</param-value>
</context-param>
一些小坑:
- 确认maven-tomcat版本>=2.2(就是需要大于tomcat7的某个版本) 否则不支持websocket,初始化失败
Error creating bean with name 'org.springframework.web.socket.server.support.WebSocketHandlerMapping#0':
-
发生404错误,无法建立连接
-没有配对路径
-
发生302错误,无法建立连接
-可能项目设置了角色权限
-
发生403错误,存在跨域问题。最坑的是浏览器还没提示是跨域。
-将<websocket:handlers >
改成<websocket:handlers allowed-origins="*" >
就是加了个允许跨域的参数 -
无法添加 allowed-origins="*" 参数,提示非法参数【绝世神坑】
-xml的文件头没写全,请参考上文的文件头对比一下少了什么