spring-springboot websockett不通,求助

spring websocket 项目搭建以及请求的基本过程 - CSDN博客
spring websocket 项目搭建以及请求的基本过程
浏览器客户端和服务器建立起websocket的链接,最初也是http请求握手,通过httpServletRequest发送http请求到服务器,其中头部就包含需要请求websocket链接的一系列信息,大概过程如下
1.客户端请求一个链接,头部中包含如下信息
GET /demo HTTP/1.1
Host: example.com
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Upgrade: WebSocket
Sec-WebSocket-Key1: 4@1 46546xW%0l 1 5
Origin: http://example.com
[8-byte security key]
2.服务器根据头部中的Sec-WebSocket-Key2,Sec-WebSocket-Key1,Upgrade,[8-byte security key] 知道客户端需要一个websocket协议链接,于是返回一个消息,包含如下头部
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http:
WebSocket-Location: ws:
[16-byte hash response]
3.客户端收到消息之后,建立起websocket链接,这时就可以进行实时通信了
我们可以定义一个处理器来实现WebSocketHandler处理请求
public class MyWebSocketHandler implements
WebSocketHandler{
* webscoket建立好链接之后的处理函数
* session 当前websocket的会话id,打开一个websocket通过都会生成唯一的一个会话,可以通过该id进行发送消息到浏览器客户端
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
* 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息
public void handleMessage(WebSocketSession session, WebSocketMessage&?& message) throws Exception {
* 消息传输过程中出现的异常处理函数
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
* websocket链接关闭的回调
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
* 是否支持处理拆分消息,返回true返回拆分消息
public boolean supportsPartialMessages() {
return false;
websocket的链接建立是基于http握手协议,我们可以添加一个拦截器处理握手之前和握手之后过程
public class MyHandShakeInterceptor implements HandshakeInterceptor{
* 握手之前,若返回false,则不建立链接
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map&String, Object& attributes) throws Exception {
return true;
* 握手之后
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception exception) {
接下来,需要我们把处理器和拦截器注册到spring websocket中
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/portfolio")
.addInterceptors(new MyHandShakeInterceptor())
.withSockJS();
在这里我们用到.withSockJS(),SockJS是spring用来处理浏览器对websocket的兼容性,目前浏览器支持websocket还不是很好,特别是IE11以下.SockJS能关键浏览器能否支持websocket来提供三种方式用于websocket请求,三种方式分别是 WebSocket, HTTP Streaming以及 HTTP Long Polling
SockJS提供了浏览器客户端的js库,在浏览器我们请求websocket就这么用
var socket = new SockJS('/whats/portfolio');
* 建立成功的回调函数
socket.onopen = function() {
console.log('open');
* 服务器有消息返回的回调函数
socket.onmessage = function(e) {
console.log('message', e.data);
* websocket链接关闭的回调函数
socket.onclose = function() {
console.log('close');
然后客户端发送一个消息
document.getElementById("ws").onclick = function() {
socket.send("fff");
服务器MyWebSocketHandler中,通过handlemessage接收消息并进行分发
* 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息
public void handleMessage(WebSocketSession session, WebSocketMessage&?& message) throws Exception {
String body = (String) message.getPayload();
session.sendMessage(message);
session可以用来标注客户端id,相对于我们的httpsession,这样,如果我们想做一个精准推送和全部推送,我们可以这么做
首先在自定义的处理其中,建一个队列来存储连进来的websocketsession
public class MyWebSocketHandler implements
WebSocketHandler{
private List&WebSocketSession& users = new ArrayList&WebSocketSession&();
* webscoket建立好链接之后的处理函数
* session 当前websocket的会话id,打开一个websocket通过都会生成唯一的一个会话,可以通过该id进行发送消息到浏览器客户端
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
session.getAttributes().put("userid", "xxxx");
users.add(session);
然后呢,我们在接收到消息的时候,就可以直接的根据需要精准推送到用户或者全部推送了
* 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息
public void handleMessage(WebSocketSession session, WebSocketMessage&?& message) throws Exception {
for (WebSocketSession webSocketSession : users) {
message = new TextMessage("ggg");
webSocketSession.sendMessage(message);
spring websocket大概的请求过程就是这样子,这是基础的请求过程,细心的同学可能发现,如果我有很多种不同的业务请求,是不是要写很多个处理器??能不能只实现一个处理器,然后由这个处理器来进行分发处理,做到类似springmvc的DispatcherServlet那样子??下次研究看看
本文已收录于以下专栏:
相关文章推荐
1、WebSocket简介WebSocket是HTML5提供的一种全双工通信的协议,通常是浏览器(或其他客户端)与Web服务器之间的通信。这使得它适合于高度交互的Web应用程序,如及时通讯聊天等。
一、测试环境
Tomcat8.0.18
二、新建一个SpringMVC的工程
使用Maven新建一个web工程,添加Spri...
1.为什么选择Netty
上一篇文章我们已经了解了Socket通信(IO/NIO/AIO)编程,对于通信模型已经有了一个基本的认识。其实上一篇文章中,我们学习的仅仅是一个模型,如果想把这些真正的用于实...
工欲善其事,必先利其器
Maven依赖的Spring-websocket的jar
org.springframework
spring-web...
org.springframework.amqp
spring-rabbit
1.2.0.RELEASE
just Java...
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:
打开一个SocketChannel并连接到互联网上的某台服...
先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...
什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的协议。它是实现了浏览器与服务器全双工通信(full-duplex)。HTML5定义了We...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)springsession如何对spring的WebSocketSession进行分布式配置? - 知乎10被浏览2124分享邀请回答62 条评论分享收藏感谢收起0添加评论分享收藏感谢收起查看更多回答2017年8月 Java大版内专家分月排行榜第三2017年4月 Java大版内专家分月排行榜第三2016年3月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如题,通过调试可以看到进入了handspake的interceptor和handle类的afterConnectionEstablished方法,但无法进入handleMessage方法造成无法转发消息,求高人指点。附上代码。
package com.angularjs.
import java.util.HashM
import java.util.M
import org.springframework.web.socket.CloseS
import org.springframework.web.socket.TextM
import org.springframework.web.socket.WebSocketS
import org.springframework.web.socket.handler.TextWebSocketH
public class TestHandler extends TextWebSocketHandler {
private static Map&String,WebSocketSession& sessionList = new HashMap&String,WebSocketSession&();
public void afterConnectionEstablished(WebSocketSession session)
throws Exception {
// TODO Auto-generated method stub
super.afterConnectionEstablished(session);
sessionList.put(session.getAttributes().get("username").toString(), session);
protected void handleTextMessage(WebSocketSession session,
TextMessage message) throws Exception {
// TODO Auto-generated method stub
super.handleTextMessage(session, message);
System.out.println("begin send msg");
WebSocketSession usersession = sessionList.get(session.getAttributes().get("username").toString());
if(usersession!=null && usersession.isOpen()){
usersession.sendMessage(message);
public void handleTransportError(WebSocketSession session,
Throwable exception) throws Exception {
// TODO Auto-generated method stub
super.handleTransportError(session, exception);
if (session.isOpen()){
sessionList.remove(session.getAttributes().get("username").toString());
public void afterConnectionClosed(WebSocketSession session,
CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
if (session.isOpen()){
sessionList.remove(session.getAttributes().get("username").toString());
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
去Log 下看一看是否出现java.lang.NoSuchMethodError找不到方法 等类似错误,原因是
有时候出现这种怪异的问题,是由于多个版本的class存在。
比如说:某个java编译成class后,放到classes下面,然后lib目录下,也有这个class所在的jar包,这样就导致classpath实际上有两个相同的class。
我就是spring.web 有两个版本而无法进入handleMessage方法,删除其中一个jar 就好了
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:

我要回帖

更多关于 spring4 websocket 的文章

 

随机推荐