赞
踩
{"toName":"张三","message":"你好"}
{"system":true,"fromName":null,"message":["李四","王五"]}
{"system":false,"fromName":"张三","message":"你好"}
在pom.xml
中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
package com.itheima.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * @version v1.0 * @ClassName: WebsocketConfig * @Description: TODO(一句话描述该类的功能) * @Author: */ @Configuration public class WebsocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
package com.itheima.config; import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; import javax.websocket.server.HandshakeRequest; import javax.websocket.server.ServerEndpointConfig; /** * @version v1.0 * @ClassName: GetHttpSessionConfig * @Description: TODO(一句话描述该类的功能) * @Author: */ public class GetHttpSessionConfig extends ServerEndpointConfig.Configurator { @Override public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { //获取HttpSession对象 HttpSession httpSession = (HttpSession) request.getHttpSession(); //将httpSession对象保存起来 sec.getUserProperties().put(HttpSession.class.getName(),httpSession); } }
package com.itheima.ws; import com.alibaba.fastjson.JSON; import com.itheima.config.GetHttpSessionConfig; import com.itheima.utils.MessageUtils; import com.itheima.ws.pojo.Message; import org.springframework.stereotype.Component; import javax.servlet.http.HttpSession; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * @version v1.0 * @ClassName: ChatEndpoint * @Description: TODO(一句话描述该类的功能) * @Author: */ @ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfig.class) @Component public class ChatEndpoint { private static final Map<String,Session> onlineUsers = new ConcurrentHashMap<>(); private HttpSession httpSession; /** * 建立websocket连接后,被调用 * @param session */ @OnOpen public void onOpen(Session session, EndpointConfig config) { //1,将session进行保存 this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName()); String user = (String) this.httpSession.getAttribute("user"); onlineUsers.put(user,session); //2,广播消息。需要将登陆的所有的用户推送给所有的用户 String message = MessageUtils.getMessage(true,null,getFriends()); broadcastAllUsers(message); } public Set getFriends() { Set<String> set = onlineUsers.keySet(); return set; } private void broadcastAllUsers(String message) { try { //遍历map集合 Set<Map.Entry<String, Session>> entries = onlineUsers.entrySet(); for (Map.Entry<String, Session> entry : entries) { //获取到所有用户对应的session对象 Session session = entry.getValue(); //发送消息 session.getBasicRemote().sendText(message); } } catch (Exception e) { //记录日志 } } /** * 浏览器发送消息到服务端,该方法被调用 * * 张三 --> 李四 * @param message */ @OnMessage public void onMessage(String message) { try { //将消息推送给指定的用户 Message msg = JSON.parseObject(message, Message.class); //获取 消息接收方的用户名 String toName = msg.getToName(); String mess = msg.getMessage(); //获取消息接收方用户对象的session对象 Session session = onlineUsers.get(toName); String user = (String) this.httpSession.getAttribute("user"); String msg1 = MessageUtils.getMessage(false, user, mess); session.getBasicRemote().sendText(msg1); } catch (Exception e) { //记录日志 } } /** * 断开 websocket 连接时被调用 * @param session */ @OnClose public void onClose(Session session) { //1,从onlineUsers中剔除当前用户的session对象 String user = (String) this.httpSession.getAttribute("user"); if (user != null) { onlineUsers.remove(user); //2,通知其他所有的用户,当前用户下线了 String message = MessageUtils.getMessage(true, null, getFriends()); broadcastAllUsers(message); } else { // 处理 user 为空的情况,可以记录日志或者采取其他适当的措施 } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。