前后端分离项目二手交易平台小程序SpringBoot—-实现物品点赞功能
SpringBoot—-实现项目收藏功能
SpringBoot—-实现评论回复功能(数据库设计)
SpringBoot—-文件(图像)上传和显示(下载) )。
即时聊天是指使用websocket,在springboot上使用很简单。 前端是小程序。 这个有洞。 小程序需要域名才能通过即时聊天联机,使用wss协议时,wss更安全。 但还不足以上线,必须是企业主体的开发者。 个人开发者的即时聊天是社交的,不属于服务类别,审查不合格!功能:我们的小程序是二手交易小程序,即时聊天后台服务器有点受不了单核2g的东西。 因此,当双方都在线时,不会保存聊天消息,而只有在一方未在线时,才会保存脱机消息。 而且只能发送3条离线消息。 模仿了csdn的聊天。 由于在启动websocket之前单击访问使用:聊天,因此出现了用户注销并再次访问消息列表时将重新发送websocket请求的问题。 每个请求的会话都不同。 此外,微信限制一个用户只能同时启动五个请求。 如果一开始没能退出聊天页面就打开了,那就错了。 使用sessioin.close ()时调用onClose ) )方法的session是您要断开的session。 但是,如果前端能自己断开的话,就nice!效果
数据库设计
展示留言聊天列表中使用了表格。 last_context发送给对方的最后一条消息。 当其中一个点击私信进入聊天页面时,表中会插入两个记录。 然后删除聊天。 毕竟,即使一方删除,也不能让另一方看到信息
有关消息的详细脱机内容,我们使用了另一个表。 33558 www.Sina.com/: package com.w.wx.controller.web socket; import com.Alibaba.fast JSON.JSON; import com.Alibaba.fast JSON.JSON object; import com.w.wx.domain.chatmessage; import com.w.wx.service.chatservice; import com.w.wx.utils.altohmutil; import lombok.extern.slf4j.slf4j; importorg.spring framework.beans.factory.annotation.auto wired; importorg.spring framework.stereotype.com ponent; import javax.annotation.post construct; 导入javax.web socket.*; import javax.web socket.server.path param; import javax.web socket.server.server endpoint; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import Java.util.concurrent.concurrent hashmap; import Java.util.concurrent.atomic.atomic integer; @ slf4j @ server endpoint (‘/wx/{ from OpenID }/{ to OpenID } ) componentpublicclasswebsocketserver ) publicstaticwebsic @PostConstruct //此注释的方法是在加载bean之前使用privatevoidinit ({ websocketserver=this; //初始化时实例化静态interFaceInfoMapper的websocketserver.chatservice=this.chatservice; //记录当前在线连接数的静态变量。 你应该把那个设计成线程安全的。 privatestaticatomicintegeronlinenum=newatomicinteger (; //concurrent软件包的线程安全HashMap。 存储与每个客户端对应的WebSocketServer对象。 privatestaticconcurrenthashmapstring,sessionsessionpools=newconcurrenthashmap (; //发送消息的公共语音发送消息(会话会话,chatmessage消息) thr
ows IOException { if(session != null){ synchronized (session) { String s = JSONObject.toJSONString(message); System.out.println(“52 发送数据:” + s); session.getBasicRemote().sendText(s); } } } //给指定用户发送信息 public void sendInfo(String to_openid, ChatMessage message){ Session session = sessionPools.get(to_openid); if(session == null){ webSocketServer.chatService.addDeInfo(message); }else{ try { sendMessage(session, message); }catch (Exception e){ e.printStackTrace(); } } } // 群发消息 public void broadcast(ChatMessage message){ for (Session session: sessionPools.values()) { try { sendMessage(session, message); } catch(Exception e){ e.printStackTrace(); continue; } } } //收到客户端信息后,根据接收人的username把消息推下去或者群发 // to=-1群发消息 @OnMessage public void onMessage(String message) throws IOException{ ChatMessage msg=JSON.parseObject(message, ChatMessage.class); sessionPools.get(msg.getToOpenid()); webSocketServer.chatService.addInfo(message); if (msg.getToOpenid().equals(“-1”)) { broadcast(msg); } else { sendInfo(msg.getToOpenid(),msg); } } //建立连接成功调用 @OnOpen public void onOpen(Session session, @PathParam(value = “fromOpenid”) String fromOpenid,@PathParam(value = “toOpenid”) String toOpenid) throws IOException { ArrayList<ChatMessage> list = webSocketServer.chatService.getAllNotRead(fromOpenid,toOpenid); if (!list.isEmpty()) { Iterator<ChatMessage> it = list.iterator(); while (it.hasNext()) { ChatMessage chatMessage = it.next(); chatMessage.setContent(ALToHMUtil.toUnicode(chatMessage.getContent())); sendMessage(session, chatMessage); log.info(“115 当前用户接收离线消息” + chatMessage.toString()); } } sessionPools.put(fromOpenid, session); addOnlineCount(); System.out.println(“125 “+fromOpenid + “加入webSocket!当前人数为” + onlineNum); } //关闭连接时调用 @OnClose public void onClose(@PathParam(value = “fromOpenid”) String fromOpenid) throws IOException { Session session = sessionPools.get(fromOpenid); session.close(); sessionPools.remove(fromOpenid); subOnlineCount(); System.out.println(fromOpenid + “断开webSocket连接!当前人数为” + onlineNum); } //错误时调用 @OnError public void onError(Session session, Throwable throwable){ // System.out.println(“发生错误”); throwable.printStackTrace(); } public static void addOnlineCount(){ onlineNum.incrementAndGet(); } public static void subOnlineCount() { onlineNum.decrementAndGet(); } public static AtomicInteger getOnlineNumber() { return onlineNum; } public static ConcurrentHashMap<String, Session> getSessionPools() { return sessionPools; }} 2021/4/27 20:33 参考:csdn搜Java websocket 即时聊天 首页搜出来的都有看过。。。2021/5/5 18:47