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 springmvc抛出全局异常的解决方法
这篇文章主要为大家详细介绍了springboot springmvc抛出全局异常的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-06-06关于springboot集成swagger及knife4j的增强问题
这篇文章主要介绍了springboot集成swagger以及knife4j的增强,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-03-03Spring中@RequestParam、@RequestBody和@PathVariable的用法详解
这篇文章主要介绍了Spring中@RequestParam、@RequestBody和@PathVariable的用法详解,后端使用集合来接受参数,灵活性较好,如果url中没有对参数赋key值,后端在接收时,会根据参数值的类型附,赋一个初始key,需要的朋友可以参考下2024-01-01Centos 7 安装 OpenJDK 11 两种方式及问题小结
这篇文章主要介绍了Centos 7 安装 OpenJDK 11 两种方式,第一种方式使用yum安装,第二种方式使用tar解压安装,每种方法给大家介绍的非常详细,需要的朋友可以参考下2021-09-09Tomcat 8.5 +mysql 5.7+jdk1.8开发JavaSE的金牌榜小项目
这篇文章主要介绍了Tomcat 8.5 +mysql 5.7+jdk1.8开发JavaSE的金牌榜小项目,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05
最新评论