当前位置: 首页> 科技> 能源 > 浏览器直接进入网站_国外英文网站_百度开户是什么意思_韩国电视剧

浏览器直接进入网站_国外英文网站_百度开户是什么意思_韩国电视剧

时间:2025/8/30 4:22:49来源:https://blog.csdn.net/qq_49979552/article/details/143463267 浏览次数:0次
浏览器直接进入网站_国外英文网站_百度开户是什么意思_韩国电视剧

前言

技术选型还是spring的websocket,比netty更加专一性;websocket实际上只能提供消息传输功能,根据业务逻辑对其进行中间件的选择增强,点开淘宝的客服页,进行前端解析。

当从左侧选择商家时,每一次选择他都会有一个刷新的动作,但并没有请求接口,说明他并没有把聊天记录放到客户端(本地),而是每次的数据都是从服务器请求的,既然没有接口请求,那么就是通过websocket了,这三个ws请求中,有两个一样的ws请求,这个我不太理解是什么意思,知道的可以在评论区讲一下。

至于使用多个ws请求,是为了接口隔离原则,因为往往在ws业务中往往涉及到诸多分支,比如消息聊天部分就有无数个type,图片、消息、文件、商品卡片等等,还有消息提醒模块的小红点,粗略消息显示等等。

业务逻辑思路

        先完成主要的消息聊天模块,先对websocket进行一个基本的增强,当该页面长期未操作的时候会把websocket关闭来节省资源,并弹出confirm窗提示刷新。既可以在服务端也可以在客户端实现,这里在客户端实现,因为网络结构是1:n的,对后端服务器的压力会蛮大的,因为要定时轮询所有的任务查看他们的计时器,也较为复杂,所以使用客户端实现。


const socket = new WebSocket(`ws://localhost:20000/user/message/${localStorage.getItem('account')}`)socket.onopen = (event) => {resetTimer()console.log('连接已建立');
}
let timer;socket.onmessage = (event) => {resetTimer()console.log('收到消息:', event.data);
}
socket.onclose = (event) => {ElMessageBox.confirm('连接中断,请刷新重试','连接断开',{confirmButtonText: '刷新',type: 'warning',}).then(() => {window.location.reload();})
}
socket.onerror = (event) => {console.log('连接出错:', event);
}function resetTimer() {if (timer != null) clearTimeout(timer)// 连接超时处理timer = setTimeout(() => {socket.close()console.log('连接超时,已关闭')}, timeout)
}

        以上为简单实现

 @OnMessagepublic void onMessage(String message, @PathParam("account") String account) throws IOException {// 收到自己的客户端发过来的消息了// 所以结构类似/**   {type:... ,data:{fromAccount: ... ,toAccount: ... ,message: ...}}    */// 除了data里的结构不同,外面的结构都是一样的OriginalMessage originalMessage = JSON.parseObject(message, OriginalMessage.class);Class<?> suitClass = originalMessage.getSuitClass();Object o = JSON.parseObject(originalMessage.getData(), suitClass);switch (originalMessage.getType()) {case 0 :CommonMessage data = (CommonMessage) o;String toAccount = data.getToAccount();// 最简单的逻辑onlineUsers.get(toAccount).getBasicRemote().sendText(JSON.toJSONString(originalMessage));break;}}

消息处理在服务端的简单实现,还要进行消息的存储等等,对简单的消息传递进行功能的增强。

SQL设计

        目前使用了两个表,一个是session会话表,一个是消息表,sql逻辑是会话提供一些专注于会话的属性,由于会话的属性是唯一性,两个账号只能有一个会话,即使我在列表中删除了会话 ,它的属性也有不必要删除的比如simple_message(消息预显示的一条消息)等等,只需要进行update即可。创建session代码如下所示

public Result open(SessionController.TempDto dto) {// 每一个会话都是通过两个账号唯一决定的,所以根据这两个账号生成的id也是唯一的,由于会话有一些自己的属性// 所以不能把它耦合在一个表中String id = genId(dto.getMyAccount(), dto.getOtherAccount());SessionPo sessionPo = new SessionPo();sessionPo.setId(id);sessionPo.setIsDie(0);saveOrUpdate(sessionPo);return Result.ok();}
public String genId(Integer one, Integer two) {return (one.compareTo(two) > 0 ? one : two) + "-" + (one.compareTo(two) < 0 ? one : two);}

关键字:浏览器直接进入网站_国外英文网站_百度开户是什么意思_韩国电视剧

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: