当前位置: 首页 > news >正文

建筑设计资质查询平台seo 推广

建筑设计资质查询平台,seo 推广,电子商务网站业务流程,西安企业排名提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库设计二、实现代码1.SessionWrap2.websocket3.insertMessage4.清除未读 前言 使用WebSocket实现一对一的聊天功能与未读消息功能 一、数据库设计 会话…

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、数据库设计
  • 二、实现代码
    • 1.SessionWrap
    • 2.websocket
    • 3.insertMessage
    • 4.清除未读


前言

使用WebSocket实现一对一的聊天功能与未读消息功能


一、数据库设计

会话表

字段名字段类型长度注释
conversation_idint11会话ID
create_timedatetime创建时间
conversation_typeint1会话类型

消息表

字段名字段类型长度注释
message_idint11消息ID
conversation_idint11会话ID
sender_idint11发送者ID
receiver_idin t11接收者ID
contenttext消息内容
typeint2消息类型
informationvarchar255信息
sender_imgint11发送者头像ID
receiver_imgint11接收者头像ID
message_statusint1消息状态(1已读,0未读)
create_timedatetime创建时间

二、实现代码

1.SessionWrap

@Data
public class SessionWrap {private String from;	// 连接人idprivate String type;	// 连接类型private Session session;private Date lastTime;
}

2.websocket

@Component
@ServerEndpoint(value = "/api/websocket/{from}/{type}")
public class WebSocketServer {@Autowiredprivate RqriMessageService rqriMessageService;public static WebSocketServer webSocketServer;// 所有的连接会话private static CopyOnWriteArraySet<SessionWrap> sessionList = new CopyOnWriteArraySet<>();private String from;private String type;@PostConstructpublic void init() {webSocketServer = this;webSocketServer.rqriMessageService = this.rqriMessageService;}@OnOpenpublic void onOpen(Session session, @PathParam(value = "from") String from, @PathParam(value = "type") String type) {this.from = from;this.type = type;try {// 遍历list,如果有会话,更新,如果没有,创建一个新的for (SessionWrap item : sessionList) {if (item.getFrom().equals(from) && item.getType().equals(type)) {item.setSession(session);item.setLastTime(new Date());log.info("【websocket消息】更新连接,总数为:" + sessionList.size());return;}}SessionWrap sessionWrap = new SessionWrap();sessionWrap.setFrom(from);sessionWrap.setType(type);sessionWrap.setSession(session);sessionWrap.setLastTime(new Date());sessionList.add(sessionWrap);log.info("【websocket消息】有新的连接,总数为:" + sessionList.size());} catch (Exception e) {log.info("【websocket消息】连接失败!错误信息:" + e.getMessage());}}@OnClosepublic void onClose() {try {sessionList.removeIf(item -> item.getFrom().equals(from) && item.getType().equals(type));log.info("【websocket消息】连接断开,总数为:" + sessionList.size());} catch (Exception e) {log.info("【websocket消息】连接断开失败!错误信息:" + e.getMessage());}}@OnMessagepublic void onMessage(String message, Session session) {try {if ("ping".equals(message)) {session.getBasicRemote().sendText("ping");	// 心跳检测} else {// 将消息插入到数据库JSONObject r = webSocketServer.rqriMessageService.insertMessage(message);// 成功if (r.getInteger("code") == 200) {JSONObject data = r.getJSONObject("data");String senderId = data.getString("senderId");      // 发送者String receiverId = data.getString("receiverId");   // 接收者for (SessionWrap item : sessionList) {if (senderId.equals(item.getFrom()) || receiverId.equals(item.getFrom()) ) {item.getSession().getBasicRemote().sendText(r.toJSONString());} }log.info("【websocket消息】发送消息:" + r.toJSONString());}}} catch (Exception e) {log.info("【websocket消息】发送消息失败!错误信息:" + e.getMessage());}}@OnErrorpublic void onError(Session session, Throwable error) {log.error("用户错误,原因:"+error.getMessage());error.printStackTrace();}}

3.insertMessage

private final String rqriMessageStr = "rqri_message_unread_";public JSONObject insertMessage(String message) {JSONObject jsonObject = new JSONObject();RqriMessage rqriMessage = JSONObject.parseObject(message, RqriMessage.class);// 把消息添加到数据库int i = rqriMessageMapper.insertSelective(rqriMessage);// 将未读信息添加到redis  添加接收者的未读String conversationId = String.valueOf(rqriMessage.getConversationId());String receiverId = String.valueOf(rqriMessage.getReceiverId());String key = rqriMessageStr + conversationId + "_" + receiverId;if (redisUtils.get(key) == null) {redisUtils.set(key, 1, 0); 	// 设置永不过期} else {redisUtils.incr(key, 1);	// 未读数量添加1}jsonObject.put("code", 200);jsonObject.put("data", rqriMessage);// 发送者的id和未读数量,返回给前端渲染到页面HashMap<String, Integer> map = new HashMap<>();map.put("num", Integer.valueOf(redisUtils.get(key).toString()));map.put("id", rqriMessage.getSenderId());jsonObject.put("isread", map);return jsonObject;
}

4.清除未读

最后在进入聊天页面和退出聊天页面时把未读数量清零。

http://www.ds6.com.cn/news/117861.html

相关文章:

  • 网站做外链多少钱重庆百度推广优化排名
  • 撰写网站规划书wordpress seo教程
  • 徐州网站建设4成都网站设计
  • 一个网站 多个域名投放广告的渠道有哪些
  • 如何通过做网站赚钱站长工具名称查网站
  • 重庆公章备案查询网站seo的排名机制
  • 网站创意设计方案专业软文发稿平台
  • 杭州网站的特点免费网络空间搜索引擎
  • 电子商务平台的功能有哪些麒麟seo外推软件
  • 建设部官方网站今天上海重大新闻事件
  • 聊城网站制作价格百度怎么投放自己的广告
  • 拼多多电商网站建设磁力
  • 做租赁哪个网站好国内十大4a广告公司
  • 建设银行网站官网上海网络推广软件
  • 郑州新闻百度宁波seo关键词如何优化
  • 德阳北京网站建设餐饮培训
  • 怎么给网站做后台百度客服24小时人工服务在线咨询
  • 幼儿园微信公众号如何做微网站seo是什么牌子
  • 传统软件开发流程网站优化企业排名
  • 惠州做网站 百度优化产品线上营销方案
  • 媒介盒子网站是哪家公司做的自己搭建网站
  • 如何做独立的网站销售大连企业网站建站模板
  • WordPress外链转内链插件seo有哪些优化工具
  • seo建站工具软文的概念
  • 有没有免费注册域名的网站seo的排名机制
  • 网站首页设计制作教程百度推广用户注册
  • 最好玩的网站企业邮箱网页版
  • 网站建设中外链与内链的技巧网站权重如何查询
  • wordpress 增加模板网络优化工具app手机版
  • 制作网站价格不一昆明seo推广外包