继续上篇完善 Netty + Redis + Websocket IM 分布式集群实现

MyWebsocketHandler 更新代码
/**
* 处理客户端与服务端之间的websocket业务
*
* @param ctx ctx
* @param frame frame
*/
private void handWebsocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
// 判断是否是关闭websocket的指令
if (frame instanceof CloseWebSocketFrame) {
handshaker.close(ctx.channel(), ((CloseWebSocketFrame) frame).retain());
log.debug("接收到关闭websocket的指令");
}
// 判断是否是ping消息
if (frame instanceof PingWebSocketFrame) {
ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
log.debug("接收到ping消息");
return;
}
// 判断是否是二进制消息,如果是二进制消息,则抛出异常
if (!(frame instanceof TextWebSocketFrame)) {
log.error("目前不支持二进制消息");
throw new UnsupportedOperationException("【" + this.getClass().getName() + "】不支持的消息");
}
// 获取客户端向服务端发送的消息
String requestStr = ((TextWebSocketFrame) frame).text();
log.debug("服务端收到客户端的消息: {}", requestStr);
if (StringUtil.isNullOrEmpty(requestStr)){
return;
}
// 发布到redis 订阅列表中,进行广播
String keychannel = ctx.channel().id().asLongText();
//是否第一次连接上来
if (requestStr.startsWith("connect:")){

本文介绍如何利用Netty、Redis和WebSocket技术实现一个IM即时通讯系统的分布式集群,重点在于用户多端登录时的消息推送。通过Netty进行高效的数据传输,借助Redis存储和同步用户状态,使用WebSocket提供双向通信通道。
最低0.47元/天 解锁文章
3736

被折叠的 条评论
为什么被折叠?



