| | |
| | | package com.java110.api.websocket; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.java110.dto.WsDataDto; |
| | | import com.java110.utils.util.StringUtil; |
| | | import com.java110.vo.ResultVo; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import com.java110.core.log.LoggerFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.websocket.*; |
| | |
| | | * @Version 1.0 |
| | | * add by wuxw 2020/6/5 |
| | | **/ |
| | | @ServerEndpoint("/ws/message/{userId}") |
| | | @ServerEndpoint("/ws/message/{userId}/{clientId}") |
| | | @Component |
| | | public class MessageWebsocket { |
| | | private final static Logger logger = LoggerFactory.getLogger(MessageWebsocket.class); |
| | |
| | | */ |
| | | private String userId = ""; |
| | | |
| | | private String clientId = ""; |
| | | |
| | | |
| | | /** |
| | | * 连接建立成功调用的方法 |
| | | */ |
| | | @OnOpen |
| | | public void onOpen(Session session, @PathParam("userId") String userId) { |
| | | public void onOpen(Session session, @PathParam("userId") String userId, @PathParam("clientId") String clientId) { |
| | | this.session = session; |
| | | this.userId = userId; |
| | | this.clientId = clientId; |
| | | if (webSocketMap.containsKey(userId)) { |
| | | webSocketMap.remove(userId); |
| | | webSocketMap.put(userId, this); |
| | |
| | | } |
| | | |
| | | |
| | | logger.debug("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount()); |
| | | logger.debug("用户连接:" + userId + ",客户端:" + clientId + ",当前在线人数为:" + getOnlineCount()); |
| | | |
| | | try { |
| | | sendMessage("连接成功"); |
| | | } catch (IOException e) { |
| | | logger.error("用户:" + userId + ",网络异常!!!!!!"); |
| | | logger.error("用户:" + userId + ",客户端:" + clientId + ",网络异常!!!!!!"); |
| | | } |
| | | } |
| | | |
| | |
| | | //从set中删除 |
| | | subOnlineCount(); |
| | | } |
| | | logger.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount()); |
| | | logger.info("用户退出:" + userId + ",客户端:" + clientId + ",当前在线人数为:" + getOnlineCount()); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param message 客户端发送过来的消息 |
| | | */ |
| | | @OnMessage |
| | | public void onMessage(String message, Session session) { |
| | | logger.info("用户消息:" + userId + ",报文:" + message); |
| | | public void onMessage(String message, Session session) throws IOException { |
| | | logger.info("用户消息:" + userId + ",客户端:" + clientId + ",报文:" + message); |
| | | //可以群发消息 |
| | | //消息保存到数据库、redis |
| | | if (!StringUtil.isEmpty(message)) { |
| | | try { |
| | | //解析发送的报文 |
| | | JSONObject jsonObject = JSONObject.parseObject(message); |
| | | //追加发送人(防止串改) |
| | | jsonObject.put("fromUserId", this.userId); |
| | | String toUserId = jsonObject.getString("toUserId"); |
| | | //传送给对应toUserId用户的websocket |
| | | if (!StringUtil.isEmpty(toUserId) && webSocketMap.containsKey(toUserId)) { |
| | | webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString()); |
| | | } else { |
| | | logger.error("请求的clientId:" + toUserId + "不在该服务器上"); |
| | | //否则不在这个服务器上,发送到mysql或者redis |
| | | } |
| | | } catch (Exception e) { |
| | | logger.error("接收客户端消息失败", e); |
| | | } |
| | | if (StringUtil.isEmpty(message)) { |
| | | ResultVo resultVo = new ResultVo(ResultVo.CODE_ERROR, "未包含内容"); |
| | | webSocketMap.get(userId).sendMessage(resultVo.toString()); |
| | | return; |
| | | } |
| | | |
| | | if (!StringUtil.isJsonObject(message)) { |
| | | ResultVo resultVo = new ResultVo(ResultVo.CODE_ERROR, "不是有效数据格式"); |
| | | webSocketMap.get(userId).sendMessage(resultVo.toString()); |
| | | return; |
| | | } |
| | | |
| | | WsDataDto wsDataDto = JSONObject.parseObject(message, WsDataDto.class); |
| | | |
| | | switch (wsDataDto.getCmd()) { |
| | | case WsDataDto.CMD_PING: |
| | | //webSocketMap.get(userId).sendMessage(wsDataDto.toString()); |
| | | break; |
| | | } |
| | | |
| | | // //解析发送的报文 |
| | | // JSONObject jsonObject = JSONObject.parseObject(message); |
| | | // //追加发送人(防止串改) |
| | | // jsonObject.put("fromUserId", this.userId); |
| | | // String toUserId = jsonObject.getString("toUserId"); |
| | | // //传送给对应toUserId用户的websocket |
| | | // if (!StringUtil.isEmpty(toUserId) && webSocketMap.containsKey(toUserId)) { |
| | | // webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString()); |
| | | // } else { |
| | | // logger.error("请求的clientId:" + toUserId + "不在该服务器上"); |
| | | // //否则不在这个服务器上,发送到mysql或者redis |
| | | // } |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @OnError |
| | | public void onError(Session session, Throwable error) { |
| | | logger.error("用户错误:" + this.userId + ",原因:" + error.getMessage()); |
| | | error.printStackTrace(); |
| | | logger.error("用户错误:" + this.userId + ",客户端:" + clientId + ",原因:" + error.getMessage()); |
| | | // error.printStackTrace(); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public static void sendInfo(String message, String userId) throws IOException { |
| | | logger.info("发送消息到:" + userId + ",报文:" + message); |
| | | |
| | | if (!webSocketMap.containsKey(userId)) { |
| | | //客户端未连接 |
| | | return; |
| | | } |
| | | webSocketMap.get(userId).sendMessage(message); |
| | | |
| | | |
| | | } |
| | | |
| | | public static synchronized int getOnlineCount() { |