springboot 整合websocket 站内消息 (支持广播式和只给一人发送)单独信息发送 信息群发 统计连接数

线上客户端地址:http://www.niezhiliang.com:8086/index

线上服务端地址:http://www.niezhiliang.com:8086/admin




请移步到另一篇新写的文章

请移步到另一篇新写的文章

请移步到另一篇新写的文章








第一步:

使用org.springframework.web.socket.server.standard.ServerEndpointExporter.ServerEndpointExporter类。在Spring容器中添加一个该类的实例:

@Configuration  
public class WebSocketConfig {  
    @Bean  
    public ServerEndpointExporter serverEndpointExporter(){  
        return new ServerEndpointExporter();  
    }  
}  

第二步:

JSR356定义了WebSocket的规范,Tomcat7中实现了该标准。JSR356 的 WebSocket 规范使用 javax.websocket.*的 API,可以将一个普通 Java 对象(POJO)使用 @ServerEndpoint 注释作为 WebSocket 服务器的端点。

package com.suyu.websocket.server;

import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ServerEndpoint(value = "/socketServer/{userid}")
@Component
public class SocketServer {

   private Session session;
   private static Map,Session> sessionPool = new HashMap,Session>();
   private static Map,String> sessionIds = new HashMap,String>();

   /**
    * 用户连接时触发
    * @param session
    * @param userid
    */
   @OnOpen
   public void open(Session session,@PathParam(value="userid")String userid){
      this.session = session;
      sessionPool.put(userid, session);
      sessionIds.put(session.getId(), userid);
   }

   /**
    * 收到信息时触发
    * @param message
    */
   @OnMessage
   public void onMessage(String message){
      System.out.println("当前发送人sessionid为"+session.getId()+"发送内容为"+message);
   }

   /**
    * 连接关闭触发
    */
   @OnClose
   public void onClose(){
      sessionPool.remove(sessionIds.get(session.getId()));
      sessionIds.remove(session.getId());
   }

   /**
    * 发生错误时触发
    * @param session
    * @param error
    */
    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

   /**
    *信息发送的方法
    * @param message
    * @param userId
    */
   public static void sendMessage(String message,String userId){
      Session s = sessionPool.get(userId);
      if(s!=null){
         try {
            s.getBasicRemote().sendText(message);
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

   /**
    * 获取当前连接数
    * @return
    */
   public static int getOnlineNum(){
      return sessionPool.size();
   }

   /**
    * 获取在线用户名以逗号隔开
    * @return
    */
   public static String getOnlineUsers(){
      StringBuffer users = new StringBuffer();
       for (String key : sessionIds.keySet()) {
         users.append(sessionIds.get(key)+",");
      }
       return users.toString();
   }

   /**
    * 信息群发
    * @param msg
    */
   public static void sendAll(String msg) {
      for (String key : sessionIds.keySet()) {
         sendMessage(msg, sessionIds.get(key));
       }
   }

   /**
    * 多个人发送给指定的几个用户
    * @param msg
    * @param persons  用户s
    */

   public static void SendMany(String msg,String [] persons) {
      for (String userid : persons) {
         sendMessage(msg, userid);
      }

   }
}

第三步::编辑Controller

package com.suyu.websocket.controller;

import com.suyu.websocket.server.SocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * websocket
 * 消息推送(个人和广播)
 */
@Controller
public class WebSocketController {
    @Autowired
    private SocketServer socketServer;

    @RequestMapping(value = "/index")
    public String idnex() {

        return "index";
    }

    @RequestMapping(value = "/admin")
    public String admin(Model model) {
        int num = socketServer.getOnlineNum();
        String str = socketServer.getOnlineUsers();
        model.addAttribute("num",num);
        model.addAttribute("users",str);
        return "admin";
    }

    /**
     * 个人信息推送
     * @return
     */
    @RequestMapping("sendmsg")
    @ResponseBody
    public String sendmsg(String msg,String username){
        //第一个参数 :msg 发送的信息内容
        //第二个参数为用户长连接传的用户人数
        String [] persons = username.split(",");
        SocketServer.SendMany(msg,persons);
        return "success";
    }

    /**
     * 推送给所有在线用户
     * @return
     */
    @RequestMapping("sendAll")
    @ResponseBody
    public String sendAll(String msg){
        SocketServer.sendAll(msg);
        return "success";
    }

    /**
     * 获取当前在线用户
     * @return
     */
    @RequestMapping("webstatus")
    public String webstatus(){
        //当前用户个数
       int count = SocketServer.getOnlineNum();
       //当年用户的username
       SocketServer.getOnlineUsers();
        return "tongji";
    }
}

第四步:编写客户端页面,由于框架使用的是springboot,所以用了thymeleaf模板

html>
xmlns:th="http://www.thymeleaf.org">

charset="UTF-8"/>
</span>客户端首页<span style="color:#e8bf6a;">
    



请输入您的昵称type="text" id="username"/>
         type="button" value="连接" οnclick="connect()"/>   
请填写要发送的内容type="text" id="writeMsg"/> type="button" value="发送" οnclick="sendMsg()"/>

然后编写服务端发送信息的页面

html>
xmlns:th="http://www.thymeleaf.org">

charset="UTF-8"/>
</span>统计<span style="color:#e8bf6a;">
    


            当前在线人数总计
id="sum" th:text="${num}" >

具体人员为:
id="users" th:text="${users}">

发送消息:请输入推送内容type="text" id="msg"/>
请输入发送人昵称type="text" id="username"/> (如果发送多个用户,用户昵称之间用逗号隔开)
type="button" value="发送" οnclick="sendMsg()"/>
type="button" value="全部发送" οnclick="sendAll()"/>

效果图

springboot 整合websocket 站内消息 (支持广播式和只给一人发送)单独信息发送 信息群发 统计连接数_第1张图片


springboot 整合websocket 站内消息 (支持广播式和只给一人发送)单独信息发送 信息群发 统计连接数_第2张图片springboot 整合websocket 站内消息 (支持广播式和只给一人发送)单独信息发送 信息群发 统计连接数_第3张图片springboot 整合websocket 站内消息 (支持广播式和只给一人发送)单独信息发送 信息群发 统计连接数_第4张图片


项目源码:https://github.com/niezhiliang/springbootwebsocket



你可能感兴趣的:(java,springboot,maven,html5)