package com.example.chatroom.api; import com.example.chatroom.component.OnlineUserManger; import com.example.chatroom.model.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import java.io.IOException; import java.util.List; @Component public class WebSocketAPI extends TestWebSocketAPI{ @Autowired private OnlineUserManger onlineUserManger; @Autowired private MessageSessionMapper messageSessionMapper; @Autowired private MessageMapper messageMapper; private ObjectMapper objectMapper=new ObjectMapper(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { //这个方法会在 websocket 连接成功后自动调用 System.out.println("websocket 连接成功"); User user=(User) session.getAttributes().get("user"); System.out.println("userId = "+user.getUserId()); if (user==null){ return; } onlineUserManger.online(user.getUserId(), session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { //这个方法会在 websocket 收到消息后,自动调用 System.out.println("websocketAPI 收到消息"+message.toString()); //获取当前用信息 User user=(User) session.getAttributes().get("user"); if (user==null){ System.out.println("user is null"); return; } //对请求进行解析,得到的时json的对象 需要引入objectMapper MessageRequest req= objectMapper.readValue(message.getPayload(),MessageRequest.class); if (req.getType().equals("message")) { //进行消息转发 transferMessage(user,req); }else { System.out.println("req 有误"); } } private void transferMessage(User fromUser,MessageRequest req) throws IOException { //先构造MessageResponse对象 MessageResponse resp=new MessageResponse(); resp.setType("message"); resp.setFromId(fromUser.getUserId()); resp.setFromName(fromUser.getUsername()); resp.setSessionId(req.getSessionId()); resp.setContent(req.getContent()); //把Java对象转换成字符串,需要抛出异常 String respJson=objectMapper.writeValueAsString(resp); System.out.println("respJson:"+respJson); //得到sessionId的查询到MessageSession有哪些用户 List<Friend> friends= messageSessionMapper.getFriendsBySessionId(req.getSessionId(), fromUser.getUserId()); //此时的到的friend是将自己的id给去除了,但是消息发送的时候还得给自己发一份 Friend myself=new Friend(); myself.setFriendId(fromUser.getUserId()); myself.setFriendName(fromUser.getUsername()); friends.add(myself); //遍历列表,给每个用户都发送一份响应消息 for (Friend friend :friends) { //得到每个用户的userId就可以通过Websocket就可以的到每个用户的WebsocketSession WebSocketSession webSocketSession= onlineUserManger.getSession(friend.getFriendId()); if (webSocketSession == null) { //该用户不在线 continue; } webSocketSession.sendMessage(new TextMessage(respJson)); } //将转发的消息插入到数据库里面 Message message=new Message(); message.setFromId(fromUser.getUserId()); message.setSessionId(req.getSessionId()); message.setContent(req.getContent()); //自增主键和时间在数据库的时候就自动生成了 messageMapper.add(message); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { //这个方法会在连接出现异常后,自动调用 System.out.println("websocketAPI 连接异常"); User user=(User) session.getAttributes().get("user"); System.out.println("userId = "+user.getUserId()); if (user==null){ return; } onlineUserManger.offOnline(user.getUserId(), session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { //这个方法会在正常关闭后,自动调用 System.out.println("websocketAPI 正常关闭"); User user=(User) session.getAttributes().get("user"); System.out.println("userId = "+user.getUserId()); if (user==null){ return; } onlineUserManger.offOnline(user.getUserId(), session); } }
标签:13,12,System,getUserId,session,user,2023,println,import From: https://www.cnblogs.com/wllovelmbforever/p/17899925.html