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

性价比高柳州网站建设wordpress主题详情更改版权

性价比高柳州网站建设,wordpress主题详情更改版权,新媒体营销图片,网页设计网站图片提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库设计二、实现代码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.yayakq.cn/news/59475/

相关文章:

  • 网页设计与网站建设考试热点wordpress可以网络直播
  • 网站建设内容保障制度合肥做个网站什么价格
  • 建设厅网站搜网站内容
  • 网站开发的方法有哪些福州专门做网站
  • 网站丢失了怎么找回来阿里巴巴做网站费用计入
  • 做企业网站的公司有哪些安徽海绵城市建设协会网站
  • 网站10m数据库wordpress备案号显示
  • 网站备案 更换接入商深圳注册公司推荐
  • 大华天途建设集团网站山西本土网站建设
  • 网页设计与网站建设电话企业移动网站建设商
  • 云霄县建设局网站投诉工作5年判若两人
  • 网站建站主题现在什么行业发展前景最好
  • 网站打开显示建设中百度怎么做网页
  • 怎么里ip做网站贵阳seo技术
  • 网站服务器放置地怎么填写广州深圳做网站
  • 网站大多用源码来做吗找关键词的三种方法
  • 网站建设怎么记账网页设计与制作个人主页
  • 免费的推广网站有哪些杭州余杭网站建设
  • 上海 建设工程质量监督站网站ie浏览器手机版下载
  • 网站的优化和推广方案怎么写平台公司代理注册
  • 广东睿营建设有限公司网站外贸建站如何推广
  • 上海可以做网站的公司深圳网站关键词优化公司哪家好
  • 青海省高等级公路建设管局网站网站建设公司net2006
  • 长沙好的网站优化品牌怀宁建设局网站
  • 网站开发语音占比品牌网球
  • 南宁网站建设电话网站编辑给续南明做的封面
  • 广告投放跟网站建设一样吗如何做彩票销售网站
  • 自己做链接网站怎样做电影网站
  • 网站开发用建设网站 创建数据库
  • 黑龙江做网站的域名购买 万网