java基于websocket实现im聊天功能

 更新时间:2023年11月17日 09:03:44   作者:查拉图斯特拉如是  
这篇文章主要为大家介绍了java基于websocket实现im聊天功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

文字聊天应该是很多人每天常用的功能,这篇文章就来分析一下聊天是怎么创建的,他的底层逻辑是什么,以及如何实现他的底层逻辑。设计实现消息的发送过程就像这张图一样,经过websocket进行一个消息的转发,一对一是这样,在群里里面发消息也是这个逻辑,一个消息发送给多个人。本质是也是一对一聊天,只是逻辑的干预是你觉得他就是一对多群聊。


用户缓存的核心代码,缓存用户连接。SessionCache封装了用户的信息和客户端连接的引用。

/**
 * 保存sessionId与用户的map
 */
Map<String, SessionCache> sessionCacheMap = new ConcurrentHashMap<>();

当用户登录的时候建立websocket长连接并且把连接信息存入到本地缓存,当有用户给他发消息的时候进行一个消息转发。

public void wsOpen(WebSocketSession session) throws IOException {
    CacheToken cache = validateTokenAndReturnCache(session, tokenCache);
    if (cache == null) return;
    log.info("websocket id:{} 建立连接,用户token:{} 连接成功,放入在线用户缓存", session.getId(), cache.getToken());
    javsessionCacheMap.put(session.getId(), new SessionCache(cache.getToken(), session));
}

当用户下线之后的代码,从本地清除缓存,如果有用户给他发消息就存入到缓存。

/**
 * 关闭连接清除缓存
* @param sessionId
* @return
 */
public void wsClose(String sessionId) {
    SessionCache sessionCache = sessionCacheMap.remove( sessionId );
}

发送消息的代码,当消息过来获取缓存中的WebSocketSession进行一个字节流的逻辑写入。

/**
 * 发送消息的方法
* @param session
* @param payload
* @return
 */
public boolean sendData(WebSocketSession session, String payload){
    if (session == null || !session.isOpen()) {
return false;
}
    try {
        if (session.isOpen()) {
            session.sendMessage(new TextMessage(payload));
            return true;
        } else {
        // 连接关闭,丢弃消息
        // String token = (String) session.getAttributes().get("token");
         // log.debug( "websocket id:{} 已经关闭, token:{}, 丢弃消息。", session.getId(), token);
         // log.debug("websocket关闭丢弃消息:{}", payload);
            return false;
        }
    } catch (IOException e) {
        if (e instanceof IOException || e instanceof SocketTimeoutException) {
            log.info("发送消息报错:session.isOpen():{} ERROR: {}", session != null ? session.isOpen() : null,
            e.getMessage());
        } else {
            log.error("发送消息报错:session.isOpen():{}", session != null ? session.isOpen() : null, e);
        }
        return false;
    }
}

消息体

消息体常见的消息分为文字消息,图片消息还有语音消息。这里暂且不说视频流。也就是我们常用的视频聊天。首先从最基本的文字,图片和语音来说,到后台这边都是使用的JSON格式。文字就不用说了,图片的话是经过一个第三方的存储文件服务器转换成的一个链接。然后用户端进行一个渲染。然后才会看到常用的一些图片。然后语音消息其实也是一段文凭。音频其实也是一个文件。到文件服务器之后也是一个文件的链接,然后用户端进去。格式进行一个转换。最后呈现给用户的就是一段语音。

敏感字的处理

这里要说的有一个点,就是一个敏感字的处理。其实敏感字的检索这就涉及到一些算法的操作。我们可能需要查看某一段文字当中是不是有一些敏感字?在常见的操作当然是使用字符检索一下,也可以使用一些专门的检索算法,当然逻辑上每一个系统里面会有一张专门用来配置的敏感字目录,存在敏感字。进行拒绝或者打码操作。

总结

这里解释了最简单的语音聊天的一个。实现当你用户量变得很大的时候,可能已经满足不了需求。需要用到Netty进行一个性能的提升。这是后话大道至简,其实越复杂的东西是靠着简单的功能一点点往上面叠加而产生的,一对一的聊天,本质上就是数据的传递。

引用 https://www.jb51.net/article/127969.htm

以上就是java基于websocket实现im聊天的详细内容,更多关于java websocket实现im聊天的资料请关注脚本之家其它相关文章!

相关文章

  • Springboot整合Active消息队列

    Springboot整合Active消息队列

    这篇文章主要介绍了Springboot整合Active消息队列的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-12-12
  • java IO实现电脑搜索、删除功能的实例

    java IO实现电脑搜索、删除功能的实例

    下面小编就为大家带来一篇java IO实现电脑搜索、删除功能的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 详解Java如何实现自定义注解

    详解Java如何实现自定义注解

    注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。本文将通过示例详解Java如何实现自定义注解,需要的可以参考一下
    2022-06-06
  • Java实战之实现文件资料上传并生成缩略图

    Java实战之实现文件资料上传并生成缩略图

    这篇文章主要介绍了通过Java实现文件资料的上传并生成一个缩略图,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • Java中基于DeferredResult的异步服务详解

    Java中基于DeferredResult的异步服务详解

    这篇文章主要介绍了Java中基于DeferredResult的异步服务详解,DeferredResult字面意思是"延迟结果",它允许Spring MVC收到请求后,立即释放(归还)容器线程,以便容器可以接收更多的外部请求,提升吞吐量,需要的朋友可以参考下
    2023-12-12
  • java在cmd运行"-d"和"-cp"参数解读

    java在cmd运行"-d"和"-cp"参数解读

    这篇文章主要介绍了java在cmd运行"-d"和"-cp"参数用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    这篇文章主要介绍了java实现相同属性名称及相似类型的pojo、dto、vo等互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 关于springboot集成swagger及knife4j的增强问题

    关于springboot集成swagger及knife4j的增强问题

    这篇文章主要介绍了springboot集成swagger以及knife4j的增强,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 解析java中的condition

    解析java中的condition

    Condition 将 Object 监视器方法(wait()、notify()和notifyAll())分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)
    2021-06-06
  • Java Spring MVC获取请求数据详解操作

    Java Spring MVC获取请求数据详解操作

    Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet,Spring MVC 角色划分清晰,分工明细。由于 Spring MVC 本身就是 Spring 框架的一部分,可以说和 Spring 框架是无缝集成
    2021-11-11

最新评论