-
第一步:添加WebSocket依赖
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
-
第二步:注入ServerEndpointExporter
这一步是为了实现服务节点,有了服务节点,第三步的WebSocket服务类才能生效
@Configuration
@EnableWebSocket
public class MyWebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpoint() {
return new ServerEndpointExporter();
}
}
-
第三步:实现WebSocket服务类
@Component
@ServerEndpoint(value = "/websocket/{myid}")
public class MyWebSocketController {
//用来存放每个客户端对应的WebSocketTest对象,适用于同时与多个客户端通信
public static CopyOnWriteArraySet<MyWebSocketController> webSocketSet = new CopyOnWriteArraySet<MyWebSocketController>();
//若要实现服务端与指定客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
public static ConcurrentHashMap<String, MyWebSocketController> webSocketMap = new ConcurrentHashMap<String, MyWebSocketController>();
//与某个客户端的连接会话,通过它实现定向推送(只推送给某个用户)
private Session session;
//把登录用户的id放在url请求中
private String myid = "";
/**
* 建立连接成功调用的方法
*/
@OnOpen
public void onOpen(@PathParam(value = "myid") String param,Session session) {
myid = param;
this.session = session;
webSocketSet.add(this); // 添加到set中
webSocketMap.put(myid,this); // 添加到map中
System.out.println("新人 "+myid+" 加入,当前在线人数为:" + webSocketMap.size());
}
/**
* 关闭连接调用的方法
*/
@OnClose
public void onClose(Session closeSession){
webSocketMap.remove(myid);
webSocketSet.remove(this);
System.out.println("有人离开,当前在线人数为:" + webSocketMap.size());
}
private static UserService userService;
@Autowired
public void setChatService(UserService userService) {
MyWebSocketController.userService = userService;
}
/**
* 收到客户端消息调用的方法
*/
@OnMessage
public void onMessage(String str) throws Exception{
JSONObject obj = JSONObject.fromObject(str);
//取出json文件里的数据
String toid = obj.getString("toid");
String roomid = obj.getString("roomid");
String type = obj.getString("type");
String date = obj.getString("date");
String msg = obj.getString("msg");
try {
if (type.equals("friend") && webSocketMap.get(toid) != null) {
webSocketMap.get(toid).sendMessage("用户("+myid+") : "+msg);
} else if (roomid != null && roomid != "") {
Result re = userService.selectroommembers(Integer.valueOf(roomid));
ArrayList<MyFriend> member = (ArrayList<MyFriend>) re.getObj();
for (MyFriend me :member)
{
String memberid = String.valueOf(me.getId());
if (webSocketMap.get(memberid) != null){
webSocketMap.get(memberid).sendMessage("群聊("+roomid+") 》 "+"用户("+myid+") : "+msg);
}
}
} else {
System.out.println("该用户当前未在线");
}
} catch (IOException e){
e.printStackTrace();
}
}
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
}
其中这一段代码作用是为了在WebSocket类注入实例,当然也可以选择其他方法注入,这只在于开发者个人意愿。
包括service层和dao层都可以通过以下方法注入。
private static UserService userService;
@Autowired
public void setChatService(UserService userService) {
MyWebSocketController.userService = userService;
}
至此,一个简单的Spring Boot整合WebSocket就完成了,具备了简单的一对一发送消息和群发消息功能。