WebSocket 连接 出错 不知道哪里的问题
代码如下:
package com.ms.web.websocket;
import com.ms.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author Delta
*/
@Slf4j
@ServerEndpoint(value = "/ws/api/{sid}")
@Component
public class SocketServer {
private Session session;
/**
* @Author delta
* 当前在线连接数
**/
private static int onlineCount = 0;
/**
* @Author delta
* 存放每个客户端对应的MyWebsocket对象
* **/
private static Map<String, SocketServer> copyOnWriteArraySet = new HashMap();
/**
* 接收sid
**/
private String sid = "";
@OnOpen
public void onOpen(Session session,@PathParam("sid") String sid) {
this.session = session;
copyOnWriteArraySet.put(sid, this);
this.sid = sid;
SocketServer.onlineCount++;
//推送数据
sendMessage("连接成功");
log.info("有新的窗口开始监听" + sid + ",当前在线人数为:" + onlineCount);
}
@OnClose
public void onClose() {
//移除需要关闭的对象
copyOnWriteArraySet.remove(this);
SocketServer.onlineCount--;
log.info("释放的sid为:" + sid);
log.info("有一个连接关闭!当前在线人数为" + SocketServer.onlineCount);
}
/**
* @Author delta
收到客户端消息时触发。处理客户端通过这个websocket
方法提供的访问地址(eg:ws://localhost:8080/ws/api/123)
推送过来的数据.。常见于前端调用,进行数据推送。
**/
@OnMessage
public void onMsg(String info, Session session) {
//这个方法没什么暖用,之前的@Open方法已经将当前方法的session存到集合中了
Set<SocketServer> collect = copyOnWriteArraySet.values().stream().filter(a -> a.session.getId().equals(session.getId())).collect(Collectors.toSet());
//给所有已经连接的客户端进行消息群发
copyOnWriteArraySet.forEach((key, value) -> copyOnWriteArraySet.get(value.sid).sendMessage(info));
//获取服务端到客户端的通道并发送信息
collect.forEach(a -> copyOnWriteArraySet.get(a.sid).sendMessage("服务器收到了信息,并把信息返回给你" + info));
log.info("服务器收到了" + info);
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
/**
* 发送消息到客户端-> 服务器的主动推送
* @Date 17:01 2022/11/22
* @Param
* @return
**/
public synchronized void sendMessage(String message) {
try {
this.session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @Author delta
* @Description
* 这边是我们主要的业务方法,是服务器端给客户端发信息的思路,
* 在Controller层进行调用,主要是实现在接口被调用时,
* 对目前在线的客户端进行数据推送
* @Date 17:33 2022/11/22
* @Param
* @return
**/
public static void sengInfo(String msg, @PathVariable("sid") String sid) {
System.out.println("推送信息到窗口" + sid + "推送内容:" + msg);
//sid不为空就将匹配的信息发给相应客户端
if (!StringUtils.isEmpty(sid)) {
copyOnWriteArraySet.get(sid).sendMessage(msg);
}
//sid是空的,所有的客户端都发,遍历map中所有的对象,并发送信息
if (StringUtils.isEmpty(sid)) {
copyOnWriteArraySet.forEach((key, value) ->
value.sendMessage(msg));
}
}
}
我在线测试 显示的就是 1006 CLOSE_ABNORMAL