WebSocket

WebSocketConfig.java

/**
* WebSocket配置类
* @author admin
*/
@Configuration
public class WebSocketConfig {
/**
* 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}

WebSocketServer.java

/**
* websocket双通道
*
* @author admin
*/
@Slf4j
@Component
@ServerEndpoint(value = "/imserver/{username}")
public class WebSocketServer {
/**
* 记录当前在线连接者
*/
public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
/**
* 连接成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("username") String username) {
sessionMap.put(username, session);
log.info("有新用户加入,username={},当前在线人数:{}", username, sessionMap.size());
sendAllMessage("有新连接加入");
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session, @PathParam("username") String username) {
sessionMap.remove(username);
log.info("有一个连接关闭,移除username={}的用户session,当前在线人数:{}", username, sessionMap.size());
}
/**
* 收到客户端消息后调用的方法
*
* @param message
* @param session
* @param username
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam("username") String username) {
log.info("服务端收到用户username={}的消息:{}", username, message);
// JSONObject jsonObject = JSONObject.parseObject(message);
// String toUsername = jsonObject.getString("to");
// String text = jsonObject.getString("text");
// Session toSession = sessionMap.get(toUsername);
// if (Objects.nonNull(toSession)) {
// JSONObject object = new JSONObject();
// object.put("from", username);
// object.put("text", text);
// this.sendMessage(toSession, object.toJSONString());
// } else {
// log.info("发送失败未找到用户username={}的session", toUsername);
// }
// 自动返回消息
if (Objects.nonNull(session)) {
String newMessage = "服务器已成功接收到消息:[" + message + "],并坏笑一声!";
this.sendMessage(session, newMessage);
}
}
@OnError
public void onError(Session session, Throwable error) {
log.error("Websocket发生错误");
error.printStackTrace();
}
/**
* 服务端发送消息给所有客户端
*/
public void sendAllMessage(String message) {
try {
for (Session session : sessionMap.values()) {
log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
log.error("服务端发送消息给客户端失败", e);
}
}
/**
* 给某个用户发送消息
*/
public void sendMessage(Session toSession, String message) {
try {
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.info("服务端发送消息各客户端失败", e);
}
}
}

WebSocketClinet.java

待补充。

posted @   生生灯火半杯月  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示