Spring Boot集成websocket服务
Spring Boot集成websocket服务
1.添加maven依赖
<!-- Spring Boot websocket依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- websocket客户端 -->
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.5</version>
</dependency>
2. 添加Bean
我放在了启动类里
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
3.创建WebSocket服务类
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
/**
* WebSocket服务类
*
* @author meitinghe
*/
@ServerEndpoint("/api/webLiveData/{sid}")
@Component
@Slf4j
public class WebSocketServer {
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
private Session session;
/**
* 接收sid
*/
private String sid = "";
private static Map<String, Object> webSocketSetMap = new HashMap<>();
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
this.session = session;
webSocketSet.add(this);
webSocketSetMap.put(sid, this);
log.info("有新连接进入:" + sid + ",当前连接数为" + getOnlineCount());
this.sid = sid;
/*try {
//连接建立成功向接收端推送一条消息
sendMessage("连接成功");
} catch (IOException e) {
log.error("websocket IO异常");
}*/
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
//从set中删除
webSocketSet.remove(this);
webSocketSetMap.remove(this.sid);
log.info("有一连接关闭!当前连接数为" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message) {
log.info("消息到用户[" + sid + "]的消息为:" + message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param error
*/
@OnError
public void onError(Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 推送自定义消息
*/
public static void sendInfo(String message, String sid) throws IOException {
log.info("推送消息到用户(" + sid + ",推送内容为:" + message);
if (StringUtils.isNotEmpty(sid)) {
List<WebSocketServer> list = webSocketSet.stream().filter(w -> w.sid.equals(sid)).collect(Collectors.toList());
for (WebSocketServer item : list) {
item.sendMessage(message);
}
} else {
for (WebSocketServer item : webSocketSet) {
item.sendMessage(message);
}
}
}
/**
* 检查sid是否有效
*
* @param sid
* @return
*/
public static boolean checkSidIsValid(String sid) {
if (StringUtils.isNoneEmpty(sid)) {
if (webSocketSetMap.get(sid) != null) {
return true;
}
}
return false;
}
public static synchronized int getOnlineCount() {
return webSocketSet.size();
}
}
4.启动服务,测试连接
在线测试工具地址 http://coolaf.com/tool/chattest
后端日志输出
5.后端测试类示例
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author meitinghe
*/
@Slf4j
public class WebsocketClient {
public static WebSocketClient client;
public static void main(String[] args) {
try {
client = new WebSocketClient(new URI("ws://127.0.0.1:8080/api/webLiveData/user2"), new Draft_6455()) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
log.info("握手成功");
}
@Override
public void onMessage(String msg) {
log.info("收到消息==========" + msg);
if ("over".equals(msg)) {
client.close();
}
}
@Override
public void onClose(int i, String s, boolean b) {
log.info("链接已关闭:" + s);
}
@Override
public void onError(Exception e) {
e.printStackTrace();
log.info("发生错误已关闭");
}
};
} catch (URISyntaxException e) {
e.printStackTrace();
}
client.connect();
log.info(String.valueOf(client.getDraft()));
while (!client.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
log.info("正在连接...");
}
}
}