springMvc + websocket 实现点对点通信
1,pom.xml 增加spring-websocket.jar
<!-- websocket - version须和spring mvc的version保持一致,否则会
出现问题 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
package com.test.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { public class HelloWord { @RequestMapping("/hello") public String hello(){ System.out.println("hello word..."); return "success"; } } }
实现TextWebSocketHandler类
package com.test.controller; public class ResponseVO { private int code; private String data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getData() { return data; } public void setData(String data) { this.data = data; } }
package com.test.controller; public class Users { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
主要配置类(websocket有多种配置方法,这里主要讲在配置文件中配置)
package com.test.controller; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author: mpl * @date: 18-12-6 */ public class ServerEndpointHandler extends TextWebSocketHandler { /** * 维护一个用户列表(key存放用户名,value存放一个用户的WebSocketSession) */ private static Map<String,WebSocketSession> users = new ConcurrentHashMap<>(); /** * 客户端建立连接之后执行此方法(onOpen) * @param session 每当客户端连接之后,容器会其创建一个Session对象, * 这个对象在spring中就是WebSocketSession * @throws Exception */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("客户端建立了连接..."); //获取用户名,getAttributes方法得到的是一个Map //这个map里面存放了握手拦截器将HttpSession作用域拷贝过去的数据 Users user = (Users)session.getAttributes().get("user"); //将用户的session保存到用户列表中 users.put(user.getUserName(),session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { System.out.println("接收客户端消息..." + message.getPayload()); //获取用户名 Users sendUser = (Users) session.getAttributes().get("user"); //群发消息 for(String userName:users.keySet()){ //重新构建一个TextMessage TextMessage newMessage = new TextMessage(sendUser.getUserName() + " : " + message.getPayload()); //发送所有人 users.get(userName).sendMessage(newMessage); } } /** * 客户端关闭或断开连接时执行此方法(onClose) * @param session * @param status * @throws Exception */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { System.out.println("客户端断开连接..."); session.close(); } }
验证用户配置-----
package com.test.controller; /** * @author: mpl * @date: 18-12-6 */ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @RestController public class UserController { /** * 验证用户账户登录 * @param * @param session * @return */ @RequestMapping("/userLogin") public String login(@RequestParam String userid, HttpSession session){ Users user = new Users(); user.setUserName(userid); session.setAttribute("user",user); return "ok"; } }