websocket 自定义使用(3)
创始人
2024-06-02 19:51:46
0

文章目录

  • 1.添加依赖
  • 2.编辑WebSocketConfig,
  • 3.编写WebSocketHandlerInterceptor
  • 4.编写MyWebSocketHandler
    • 使用
  • 5.自定义解码器
    • 使用

1.添加依赖


org.springframeworkspring-messaging4.1.7.RELEASE

org.springframeworkspring-websocket4.1.7.RELEASE

javax.websocketjavax.websocket-api1.0provided

2.编辑WebSocketConfig,

根据spring文档,编写websocketConfig,这里可参看文档,xml配置和使用注解两种方式,我选择注解方式

registerWebSocketHandlers:这个方法是向spring容器注册一个handler地址,我把他理解成requestMapping(也可以理解为@ServerEndpoint(“/webSocket”))

addInterceptors:拦截器,当建立websocket连接的时候,我们可以通过继承spring的HttpSessionHandshakeInterceptor来搞事情。

setAllowedOrigins:跨域设置,表示所有域名都可以,不限制, 域包括ip:port, 指定可以是任意的域名,不加的话默认localhost+本服务端口

withSockJS: 这个是应对浏览器不支持websocket协议的时候降级为轮询的处理。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(webSocketHandler(), "/websocket/socketServer").addInterceptors(new WebSocketHandlerInterceptor()).setAllowedOrigins("*");registry.addHandler(webSocketHandler(), "/sockjs/socketServer").setAllowedOrigins("http://localhost:28180").addInterceptors(new WebSocketHandlerInterceptor()).withSockJS();}@Beanpublic TextWebSocketHandler webSocketHandler() {return new WebSocketHandler();}
}

3.编写WebSocketHandlerInterceptor

这个是创建websocket连接是的拦截器,记录建立连接的用户的session以便根据不同session来通信

public class WebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map attributes) throws Exception {System.out.println("Before Handshake");if (request instanceof ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;HttpSession session = servletRequest.getServletRequest().getSession(false);if (session != null) {//使用userName区分WebSocketHandler,以便定向发送消息String userName = (String) session.getAttribute("SESSION_USERNAME");  //一般直接保存user实体if (userName != null) {attributes.put("WEBSOCKET_USERID", userName);}}}return super.beforeHandshake(request, response, wsHandler, attributes);}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Exception ex) {super.afterHandshake(request, response, wsHandler, ex);}}

4.编写MyWebSocketHandler

@Configuration
public class MyWebSocketHandler extends TextWebSocketHandler {//Map来存储WebSocketSession,key用USER_ID 即在线用户列表private static ConcurrentHashMap users = new ConcurrentHashMap<>();//用户标识private static final String USER_ID = "WEBSOCKET_USERID";   //对应监听器从的keypublic MYWebSocketHandler() {}/*** 连接成功时候,会触发页面上onopen方法*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {System.out.println("成功建立websocket连接!");String userId = session.getId();users.put(userId, session);System.out.println("当前线上用户数量:" + users.size());//这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户//TextMessage returnMessage = new TextMessage("成功建立socket连接,你将收到的离线");//session.sendMessage(returnMessage);}/*** 关闭连接时触发*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {String userId = (String) session.getAttributes().get(USER_ID);System.out.println("用户" + userId + "已退出!");users.remove(userId);System.out.println("剩余在线用户" + users.size());}/*** js调用websocket.send时候,会调用该方法*/@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {/*** 收到消息,自定义处理机制,实现业务*/System.out.println("服务器收到消息:" + message);if (message.getPayload().startsWith("#anyone#")) { //单发某人sendMessageToUser((String) session.getAttributes().get(USER_ID), new TextMessage("服务器单发:" + message.getPayload()));} else if (message.getPayload().startsWith("#everyone#")) {sendMessageToUsers(new TextMessage("服务器群发:" + message.getPayload()));} else {}}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {if (session.isOpen()) {session.close();}System.out.println("传输出现异常,关闭websocket连接... ");String userId = (String) session.getAttributes().get(USER_ID);users.remove(userId);}@Overridepublic boolean supportsPartialMessages() {return false;}/*** 给某个用户发送消息** @param userId* @param message*/public void sendMessageToUser(String userId, TextMessage message) {for (String id : users.keySet()) {if (id.equals(userId)) {try {if (users.get(id).isOpen()) {users.get(id).sendMessage(message);}} catch (IOException e) {e.printStackTrace();}break;}}}/*** 给所有在线用户发送消息** @param message*/public void sendMessageToUsers(TextMessage message) {for (String userId : users.keySet()) {try {if (users.get(userId).isOpen()) {users.get(userId).sendMessage(message);}} catch (IOException e) {e.printStackTrace();}}}
}

使用

@Autowired
MyWebSocketHandler webSocket;

5.自定义解码器

public class WebSocketCustomEncoding implements Encoder.Text {@Overridepublic String encode(Map user) {assert user != null;return JSON.toJSONString(user);}@Overridepublic void init(EndpointConfig endpointConfig) {}@Overridepublic void destroy() {}
}

使用

@ServerEndpoint(value = "/webSocketService", encoders = {ImageEncoder.class})

相关内容

热门资讯

乞讨者作文650字 乞讨者作文650字  说到乞丐,大家一定都不陌生,五山的街道旁随处可见。在路上开车的时候,车窗旁也会...
小朋友友谊作文400字 关于小朋友友谊作文400字汇总5篇  在平凡的学习、工作、生活中,大家总免不了要接触或使用作文吧,根...
我心目中的父母作文 我心目中的父母作文我心目中的父母有一种爱是无私的,有一种爱是伟大的,有一种爱是永恒的!这爱,刚开始起...
>有感 -作文 >有感 -作文  在平日的学习、工作和生活里,大家都不可避免地要接触到作文吧,借助作文人们可以反映客...
洛阳“龙门石窟”游记作文 洛阳“龙门石窟”游记作文  在日常学习、工作抑或是生活中,大家对作文都不陌生吧,借助作文人们可以实现...
掌声的作文 掌声的作文(10篇)  在平凡的学习、工作、生活中,大家都尝试过写作文吧,借助作文人们可以反映客观事...
写字之星作文 写字之星作文  我们班有一个“写字之星”—孔奕如!她的“雄伟事迹”已经很多了,准确来说是多的数不清!...
跳长绳优秀作文 跳长绳优秀作文(通用10篇)  在日常学习、工作或生活中,大家都写过作文,肯定对各类作文都很熟悉吧,...
我当按摩师作文 我当按摩师作文XX年03月13日 星期日晚上,我刚作完作业,就发现妈妈坐在床上一直用手揉着后背,我瞧...
春天的味道作文 春天的味道作文通用15篇  在现实生活或工作学习中,大家总少不了接触作文吧,作文要求篇章结构完整,一...
清响作文600字 清响作文600字  在我们平凡的日常里,大家总少不了接触作文吧,作文根据体裁的不同可以分为记叙文、说...
傅雷家书好词好句摘抄 傅雷家书好词好句摘抄  在现实社会中,大家肯定对各类好词好句都很熟悉吧,好词好句的积累对于写作文时可...
勇气作文 关于勇气作文(精选40篇)  在学习、工作、生活中,大家都写过作文,肯定对各类作文都很熟悉吧,根据写...
描写昆虫的优美段落 描写昆虫的优美段落  昆虫王国里有趣的昆虫多得数不清,凭我们现在对昆虫的认识还是肤浅的,我们还需要探...
人无完人作文500字 人无完人作文500字  “人无完人”这个成语用在我身上,那是最好不过的了。老师要求我们遵守的十三条良...
初三语文辅导作文600字 初三语文辅导作文600字  在日常生活或是工作学习中,大家最不陌生的就是作文了吧,写作文可以锻炼我们...
写景优美作文摘抄好句好段 写景优美作文摘抄好句好段大全  大家都写过作文,肯定对各类作文都很熟悉吧,尤其是充满意境的写景作文,...
成长类的作文 成长类的作文(精选5篇)  在日常学习、工作抑或是生活中,大家对作文都再熟悉不过了吧,借助作文可以提...
柳作文 柳作文  在平日的学习、工作和生活里,大家都有写作文的经历,对作文很是熟悉吧,借助作文人们可以实现文...
洗菜作文400字 洗菜作文400字四篇  在日常学习、工作或生活中,大家都有写作文的经历,对作文很是熟悉吧,写作文是培...