maven依赖
<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId><artifactId>tomcat7-websocket</artifactId></dependency><dependency><groupId>javax.websocket</groupId><artifactId>websocket-api</artifactId></dependency>
配置类
public class WebSocketConfigurator extends Configurator {public ExecutorService getExecutorService(ServerEndpointConfig sec) {// 创建一个具有足够线程数的线程池return Executors.newFixedThreadPool(100);}public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {// 设置最大消息大小
// response.setHeader("JSESSIONID", request.getSession().getId());
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Credentials", "true");
// response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
// response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept, Origin");super.modifyHandshake(sec, request, response);}
}
跨域请求过滤
/**** 跨域请求过滤
* @ClassName: SecurityServlet
* @Description: TODO(这里用一句话描述这个类的作用)*/
public class SecurityServlet extends HttpServlet implements Filter {private static final long serialVersionUID = 1L; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2) throws IOException, ServletException { HttpServletResponse response=(HttpServletResponse) resp; response.setCharacterEncoding("UTF-8");response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "*");response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");response.setHeader("Access-Control-Expose-Headers", "*");arg2.doFilter(req, resp);return; }public void init(FilterConfig arg0) throws ServletException { } }
系统初始化监听器
/*** 系统初始化监听器,在系统启动时运行,进行一些初始化工作**/
public class InitListener implements javax.servlet.ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {}public void contextInitialized(ServletContextEvent event) {}}
websocket 消息服务类
@Component("LayIMServer")
@ServerEndpoint(value ="/websocket/{param}", configurator = WebSocketConfigurator.class)
@Scope("prototype")
public class LayIMServer {/*** 打开连接,每个客户端连接上以后都会调用此方法** @Description * @param session* @return void*/@OnOpenpublic <T> void open(Session session, @PathParam("param") String param) {//解析参数Map<String, Object> paramMap = getParamMap(param);String sourceApp = oConvertUtils.getString(paramMap.get("sourceApp"));String uid = oConvertUtils.getString(paramMap.get("uid"));//用户昵称String nickname = oConvertUtils.getString(paramMap.get("nickname"));if (!StringUtil.isNotEmpty(sourceApp)) {throw new RuntimeException("应用来源标识不能为空");}if (!StringUtil.isNotEmpty(uid)) {throw new RuntimeException("用户ID不能为空");}SocketUser user = new SocketUser();user.setSession(session);user.setUserId(uid);user.setSourceApp(sourceApp);user.setNickname(nickname);IUserManager iUserManager = LayIMFactory.createManager();System.out.println("0=" + DateUtils.getDate("yyyy-MM-dd HH:mm:ss"));iUserManager.addUser(user);LayIMLog.debug("当前在线用户:" + iUserManager.getOnlineCount());LayIMLog.debug("用户建立连接:" + uid);
// // 发送消息MessageSender sender = new MessageSender();sender.sendUpdateVisualizationScreen(user);}/*** 接收消息** @Description * @param message* @param session* @param param* @return void*/@OnMessagepublic void onMessage(String message, Session session, @PathParam("param") String param) {System.out.println("onMessage--------"+message);}private Map<String, Object> getParamMap(String param) {Map<String, Object> paramMap = new HashMap<String, Object>();if (StringUtil.isNotEmpty(param)) {for (int a = 0; a < param.split("&").length; a++) {String param1[] = param.split("&")[a].split("=");paramMap.put(param1[0], "");if (param1.length == 2) {paramMap.put(param1[0], param1[1]);}}}return paramMap;}/*** 异常信息** @Description * @param t* @return void*/@OnErrorpublic void error(Throwable t) {t.printStackTrace();}/*** 关闭连接** @Description * @param session* @param param* @return void*/@OnClosepublic void close(Session session, @PathParam("param") String param) {//解析参数Map<String, Object> paramMap = getParamMap(param);String userId = oConvertUtils.getString(paramMap.get("uid"));IUserManager iUserManager = LayIMFactory.createManager();//获取用户信息SocketUser socketUser = iUserManager.getUser(userId);if(ObjectUtil.isNull(socketUser)){LayIMLog.debug("异常,用户未在线,不可执行离线操作");return;}LayIMLog.debug("用户离线:" + userId);// 移除该用户LayIMFactory.createManager().removeUser(socketUser);}
发送消息
/*** 发送信息类 所有从客户端到服务端的消息转发到此类进行消息处理 */
public class MessageSender {/** 发生消息* */public void sendUpdateVisualizationScreen(BladeUser user) {//获取在线用户IUserManager iUserManager = LayIMFactory.createManager();Map<String, SocketUser> sceneUser = iUserManager.getSocketUserMap();if(CollectionUtils.isEmpty(sceneUser)){return;}sceneUser.forEach((key, socketUser) -> {Session session = socketUser.getSession();try {if(session.isOpen()) {//给指定用户发生更新消息,获取内容发生给前端 Map<String,Object> visualStatisticsData = getData(user);sendText(socketUser,LayIMFactory.createSerializer().toJSON(visualStatisticsData));}} catch (Exception e) {e.printStackTrace();}});}
}