zoukankan      html  css  js  c++  java
  • 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室

      聊天室高频率、低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了。

      聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行分发和处理。

      握手阶段HandshakeInterceptor需要做的处理  

    public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
      .........
        @Override
        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes)throws Exception {
            System.out.println("Before Handshake");
            if (request instanceof ServletServerHttpRequest) {
                ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
                HttpSession session = servletRequest.getServletRequest().getSession(false);
                String username = (String) session.getAttribute("username");
                if(username != null && "".equals(""))
                    attributes.put("username", username);
            }
            return super.beforeHandshake(request, response, wsHandler, attributes);
        }

      MessageHandler需要对消息进行分发

    public class MessageHandler extends TextWebSocketHandler {
        //保存用户的websocket连接
        private Map<String,WebSocketSession> users = new HashMap<String,WebSocketSession>();
        
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            if(!"".equals(message.getPayload()))
                session.sendMessage(message);
            
        }
        
        public void afterConnectionEstablished(WebSocketSession session)throws Exception {
         //连接建立后,保存用户信息,并向全部在线用户发登陆信息
            users.put(session.getId(), session);
            String username = (String) session.getAttributes().get("username");
            if(users != null){
                for(WebSocketSession wssession : users.values()){
                    handleMessage(wssession, new TextMessage(username + " joined!!"));
                }
            }
        }
        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            //退出后,需要移除用户信息
            users.remove(session.getId());
            String username = (String) session.getAttributes().get("username");
            if(users != null){
                for(WebSocketSession wssession : users.values()){
                    handleMessage(wssession, new TextMessage(username + " left!!"));
                }
            }
        }
        //群发信息
        public void sendMsgToUsers(TextMessage message) throws Exception{
            if(users != null){
                for(WebSocketSession wssession : users.values()){
                    handleMessage(wssession, message);
                }
            }
        }
        
        
    }

      核心代码就是HandshakeInterceptor和MessageHandler,效果图如下:

    附代码:http://git.oschina.net/yongjian1992/websocket

  • 相关阅读:
    python 适合的才是最好的
    [转]linux 同步IO: sync、fsync与fdatasync
    Java Metrics系统性能监控工具
    [转]mysql共享锁和排它锁
    基于空间数据库MongoDB实现全国电影票预定系统
    sharing-jdbc分库分表规则
    乐观锁更新失败处理小坑
    通过MessageFormat进行字符格式拼接,比String.format跟方便
    通过jvisualvm监控fullgc
    防止重复提交
  • 原文地址:https://www.cnblogs.com/ginponson/p/4737780.html
Copyright © 2011-2022 走看看