基于websocket+Redis的实时聊天系统

这篇具有很好参考价值的文章主要介绍了基于websocket+Redis的实时聊天系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本项目是基于websocket的实时聊天系统,由于在项目开发中需要使用到在线聊天功能,所以学了websocket来实现了这个功能。能够实时推送聊天记录,使用Redis保存聊天记录和聊天列表。用户上线后可以查看与别人的聊天记录和最近的聊天用户。在网上搜索了很久,都没有看到合适的项目,所以自己写了一套。

效果图

websocket redis,java,html5,spring boot

 websocket redis,java,html5,spring boot

 消息 封装类 ChatMessage.java

/**
 * {@code @Description}: 聊天信息封装
 */
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Data
public class ChatMessage {
//    接收者用户名
    private String recipientUsername;
//    接收者头像地址
    private String recipienHeadUrl;
//    接收者网名
    private String recipienName;
//    发送者用户名
    private String senderUsername;
//    发送者头像地址
    private String senderName;
//    发送者网名
    private String senderHeadUrl;
//    消息
    private String message;
//    发送时间
    private String date;
}

聊天列表封装类  ChatList.java

/**
 * {@code @Description}: 描述
 */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ChatList {
    //    用户名
    private String username;
    //    头像地址
    private String recipienHeadUrl;
    //    网名
    private String screenName;

}

消息推送类 ChatWebSocketServer.java文章来源地址https://www.toymoban.com/news/detail-692699.html

@Component("chat")
@ServerEndpoint(value = "/chat/{recipientUsername}/{sender}")
public class ChatWebSocketServer {
     private static RedisTemplate redisTemplate;
     @Autowired
     @Qualifier("myredis")
     public void setRedisTemplate(RedisTemplate redisTemplate){
         this.redisTemplate = redisTemplate;
     }
    private final static Logger log = LoggerFactory.getLogger(ChatWebSocketServer.class);
    private Session session;

    private static ConcurrentHashMap<String, ChatWebSocketServer> websocketMap = new ConcurrentHashMap<>();
    private String recipientUsername;
    @OnOpen
    public void onOpen(Session session,@PathParam("recipientUsername") String recipientUsername,@PathParam("sender") String sender)
    {
        this.session = session;
        websocketMap.put(recipientUsername,this); //加入map中
        this.recipientUsername=recipientUsername;
        try {
            memor(recipientUsername,sender);
        } catch (Exception e) {

            log.error("websocket IO异常");
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {

        if(websocketMap.get(this.recipientUsername)!=null){
            websocketMap.remove(this.recipientUsername);  //从map中删除

        }
    }
    
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
    }
    
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

//    自定义消息推送
    public  void sendMessage(ChatMessage chatMessage) {
        if(StringUtils.isNotBlank(chatMessage.getMessage())){
            ChatWebSocketServer webSocketServer = websocketMap.get(chatMessage.getRecipientUsername());
            if (webSocketServer != null) {
                try {
                    webSocketServer.sendMessage("chat:"+chatMessage.toString());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
//            将信息保存在Redis
            redisTemplate.opsForList().leftPush("chat:"+chatMessage.getRecipientUsername()+":"+chatMessage.getSenderUsername(),"chat:"+JSON.toJSONString(chatMessage));
//            redisTemplate.opsForList().leftPush("chat:"+chatMessage.getSenderUsername()+":"+chatMessage.getRecipientUsername(),"chat:"+JSON.toJSONString(chatMessage));

//            保存会话列表
            redisTemplate.opsForSet().add("chatList:"+chatMessage.getRecipientUsername(),JSON.toJSONString(new ChatList(chatMessage.getSenderUsername(),chatMessage.getSenderHeadUrl(),chatMessage.getSenderName())));
            redisTemplate.opsForSet().add("chatList:"+chatMessage.getSenderUsername(),JSON.toJSONString(new ChatList(chatMessage.getRecipientUsername(),chatMessage.getRecipienHeadUrl(),chatMessage.getRecipienName())));

//            回显消息
            ChatWebSocketServer webSocket = websocketMap.get(chatMessage.getSenderUsername());
            if (webSocket!=null) {
                try {
                    webSocket.sendMessage("chat:"+chatMessage.toString());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

        }

    }
//    推送缓存信息
    public void memor(String recipientUsername, String sender){
        List range = redisTemplate.opsForList().range("chat:"+recipientUsername+":"+sender, 0, -1);
        List range1 = redisTemplate.opsForList().range("chat:"+sender+":"+recipientUsername, 0, -1);
        range.addAll(range1);
        if (range!=null&&range.size()>0) {
            List<ChatMessage>chatMessageList = new ArrayList<>();
            Iterator iterator = range.iterator();
            while (iterator.hasNext()) {
                        Object next = iterator.next();
                        ChatMessage chatMessage = JSON.parseObject(String.valueOf(next).replace("chat:", ""),ChatMessage.class);
                        chatMessageList.add(chatMessage);
                    }


//                按时间排序
                chatMessageList.sort((ChatMessage c1,ChatMessage c2)->{
                    return c1.getDate().compareTo(c2.getDate());
                });
//                发送
                Iterator<ChatMessage> iterator1 = chatMessageList.iterator();
                while (iterator1.hasNext()) {
                    try {
                        ChatWebSocketServer webSocketServer = websocketMap.get(recipientUsername);
                        if (webSocketServer != null) {
                            ChatMessage next = iterator1.next();
                            webSocketServer.sendMessage("chat:"+String.valueOf(next));
                        }
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }

到了这里,关于基于websocket+Redis的实时聊天系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 极简websocket实时聊天

    在线体验链接:http://47.242.53.5:888/ 项目git地址: https://gitee.com/xiao-ming-1999/websocket-server.git 实现步骤: 在前端创建WebSocket连接:在Vue组件中使用 vue-native-websocket 库或原生的 WebSocket API来创建WebSocket连接。确保连接到服务器的WebSocket地址和端口。 在前端发送消息:在Vue组件中通

    2024年02月16日
    浏览(41)
  • 基于Springboot+WebSocket+Netty实现在线聊天、群聊系统

    此文主要实现在好友添加、建群、聊天对话、群聊功能,使用Java作为后端语言进行支持,界面友好,开发简单。 2.1、下载安装IntelliJ IDEA(后端语言开发工具),Mysql数据库,微信Web开发者工具。 1.创建maven project 先创建一个名为SpringBootDemo的项目,选择【New Project】 然后在弹出

    2024年02月14日
    浏览(41)
  • 【虹科分享】基于Redis Enterprise,LangChain,OpenAI 构建一个电子商务聊天机器人

    如何构建你自己的商务聊天机器人?注意哦,是你自己的聊天机器人。一起来看看 Redis Enterprise的向量检索是怎么帮你实现这个愿望的吧。   鉴于最近人工智能支持的 API和网络开发工具的激增,似乎每个人都在将聊天机器人集成到他们的应用程序中。   LangChain是一种备受欢

    2024年02月05日
    浏览(68)
  • 使用Gin框架搭配WebSocket完成实时聊天

    在写项目的时候,需要完成实时聊天的功能,于是简单的学习下WebSocket,想知道WebSocket是什么的小伙伴可以去网上别的地方学习一下。 要实现实时聊天,网上的大部分内容都是SpringBoot和WebSocket完成的,但是我使用Go写的,所以让我们来学习一下Gin框架搭配WebSocket完成实时聊天

    2024年02月16日
    浏览(34)
  • vue和node使用websocket实现数据推送,实时聊天

    需求:node做后端根据websocket,连接数据库,数据库的字段改变后,前端不用刷新页面也能更新到数据,前端也可以发送消息给后端,后端接受后把前端消息做处理再推送给前端展示 使用node ./app.js运行项目 在需要使用websocket连接的页面引入 默认如下: id为243 在数据库改为

    2024年02月15日
    浏览(47)
  • 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室

    😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn.net/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室 ⏱️ @ 创作时间: 2023年08月04日 WebSocket 实现聊天室的原理包括建立 WebSocket 连接的握手过程、保持连接状态以

    2024年02月10日
    浏览(50)
  • JAVA:基于Redis 实现计数器限流

    1、简述 在现实世界中可能会出现服务器被虚假请求轰炸的情况,因此您可能希望控制这种虚假的请求。 一些实际使用情形可能如下所示: API配额管理-作为提供者,您可能希望根据用户的付款情况限制向服务器发出API请求的速率。这可以在客户端或服务端实现。 安全性-防止

    2024年02月02日
    浏览(40)
  • 基于Springboot和Redis实现的在线选课系统

    毕业设计真的就是demo吗?作为工作前的最后一个校园项目,毕业设计应当尽可能的贴近企业实战,业务不必很复杂,但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统,需求也比较简单。系统初始化后会默认创建一个admin管理员账号,以及三个

    2024年03月17日
    浏览(55)
  • 【Java Web】实现帖子点赞功能——基于Redis

    点赞 支持对帖子、评论点赞; 第一次点赞,第二次点赞取消; 首页显示点赞数量 统计帖子点赞数量; 详情页显示点赞数量 统计点赞数量; 显示点赞状态; 1. LikeService定义一些关于点赞的操作 点赞: 如果已经点过赞,就取消点赞; 如果没点过赞,就add到redis; 查询某个实

    2024年02月09日
    浏览(43)
  • 基于java的聊天室系统设计与实现

    基于java的聊天室系统设计与实现 研究背景: 随着互联网技术的迅速发展和普及,在线聊天和实时通信成为人们日常交流的重要方式。聊天室系统作为实时通信的一种重要形式,具有广泛的应用场景,如远程教育、在线游戏、即时通讯、网络直播等。因此,设计和实现一个基

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包