首页 > 其他分享 >2023-12-13

2023-12-13

时间:2023-12-13 21:13:11浏览次数:31  
标签:13 12 System getUserId session user 2023 println import

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

相关文章

  • 闲话12.13
    摆。上午ds,vjudge题单刚开就切了七道,妈的树点涂色啥时候加的hack,吃了两发罚时下午才改掉这题。上午喜提rk2。刚开始讲20min就开始肚子难受,窜了。感觉宿舍又热又冷的,还没睡觉的时候热的要死,睡着了又能着凉,难受。最近两天还上火了,不爽。但是ds有一半都听懂了,赢。于是后......
  • [20231213]tmux与环境变量PTAH.txt
    [20231213]tmux与环境变量PTAH.txt--//昨天给一台机器安装配置tmux,发现登陆tmux后环境变量PATH特别长,问题在于tmux登陆后要重复执行.bash_profile的内容.--//以前遇到过,主要问题在于.bash_profile在配置PATH时写法不合理.exportPATH=$PATH;...exportPATH=$PATH;...exportPAT......
  • 每日总结12.13
    今天完成软件构造的大作业中,一直报这个错误,目前不知道是什么原因,还没解决。在解决的过程中发现可能和下面有关,但都没有问题,之后再换个办法解决吧。确认Maven或Gradle依赖配置是否正确:如果你使用Maven或Gradle进行依赖管理,确保在你的配置文件中添加了OkHttp依赖。你......
  • 2023-2024 ICPC, NERC, Northern Eurasia Onsite镜像赛瞎写
    晚饭吃的卷饼,好吃。L题意有\(n\)个字符,L代表面包,O代表洋葱,你和一个朋友需要分这些食物,需满足以下要求:每个人至少有一件物品。你从最左边向右边连续取,剩下的都是那个朋友的。你们的面包数和洋葱数不能相同。输出一个方案你分得的物品数,如无解则输出\(-1\)。做法感......
  • CF213E Two Permutation 题解
    CF213ETwoPermutations题解题意:给出两个排列$a,b$,长度分别为\(n,m\),你需要计算有多少个$x$,使得\(a_1+x,a_2+x,...a_n+x\)是\(b\)的子序列。\(n\leqm\leq2\times10^5\)分析:一个很自然的思路是直接枚举\(x\),然后只保留\(b\)中值域在\([x+1,x+n]\)......
  • test1211
    别急。先更一波T2,T3。七管荧光灯可以状压打表可以发现:一种局面为必败状态当且仅当满足\(a_{1}=x,a_{2}=x,a_{3}=x,a_{4}=y,a_{5}={z},a_{6}=z,a_{7}=z\)且\(x\oplusy\oplusz=0\)。然后就可以数位dp了,记个\(f_{i,0/1,0/1,0/1,0/1,0/1,0/1}\)。随便跑跑就行。字符串......
  • The 2023 ICPC Asia Hangzhou Regional Contest
    目录写在前面赛时MJDGHH之后的一个半小时赛后写在最后写在前面赛时题目按照过题顺序排序,赛后补题按照个人向难度排序。虽然补题大概要拖到期末之后了。这学期确实是超负荷了,现在脑子里一团糟,赛时的记忆已经不太清楚了。省流版:搏一搏单车变摩托,但是怂了。赛时M开局我正开,......
  • 12.13日记
    今天开始复习软件设计,先是UML的基础知识  在UML中存在两种建模机制:静态建模机制和动态建模机制。   当我们在实际的应用中使用面向对象的设计和分析方法时,一般遵循的步骤是:第一步,描述需求;   这个步骤一般产生用例图。第二步,根据需求建立系统的静态模型,构造系统的结......
  • 12/13每日总结
    拓扑排序简介拓扑排序就是找到做事的先后顺序每个AOV网可能有一个或者多个拓扑排序实现①从AOV网中选择一个没有前驱(入度为0)的顶点并输出。②从网中删除该顶点和所有以它为起点的有向边。③重复①和②直到当前的AOV网为空或当前网中不存在无前驱的顶点为止。使用三个数组进行实现......
  • 12/13每日总结
    拓扑排序简介拓扑排序就是找到做事的先后顺序每个AOV网可能有一个或者多个拓扑排序实现①从AOV网中选择一个没有前驱(入度为0)的顶点并输出。②从网中删除该顶点和所有以它为起点的有向边。③重复①和②直到当前的AOV网为空或当前网中不存在无前驱的顶点为止。使用三个数组进行实现......