好友
阅读权限 25
听众
最后登录 1970-1-1
ppgjx
发表于 2022-5-20 21:57
本帖最后由 ppgjx 于 2022-5-20 22:06 编辑
我使用netty websocket 本地启动后 我使用wecsocket在线测试 我打开了网页两个标签页 都链接了这个服务 这时候好像就紊乱了 我数据的处理代码是这样的 遍历所有链接的客户端 判断是不是自己 如果不是则发送信息 如果是自己则发送 "自己" 两个字符串 如图1 发送了蔡徐坤 图1自己收到了蔡徐坤 和自己两条信息 图二就没有任何消息 这是哪里问题呢?
package com.ppgjx.app.netty.test;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.concurrent.GlobalEventExecutor;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.stereotype.Component ;
import java.time.LocalDate;
@Component
@Slf4j
public class TestChannelHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
// 用户 id=>channel 示例
// 可以通过用户的唯一标识保存用户的 channel
// 这样就可以发送给指定的用户
public static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE );
// 客户端断开链接
@Override
public void handlerRemoved (ChannelHandlerContext ctx) throws Exception {
System.out .println(" 客户端断开连接 --- " + ctx.channel().id() );
clients .remove(ctx.channel());
}
@Override
public void channelRead (ChannelHandlerContext ctx, Object msg) throws Exception {
System.out .println("channelRead" );
super .channelRead(ctx, msg);
}
@Override
protected void channelRead0 (ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
// 获取客户端消息
String context = msg.text();
System.out .println(" 数据 ---" + context);
// 通知所有客户端
// clients.writeAndFlush(new TextWebSocketFrame(LocalDate.now() + " " + ctx.channel().id().asShortText() + " 消息内容 --- " + context + " 在线客户 -- " + clients.size()));
clients .forEach(ch -> {
System.out .println(ch.id().asLongText());
// 自己不发送
if (ctx .channel() != ch){
ctx .writeAndFlush(new TextWebSocketFrame(context ));
}else {
ctx .writeAndFlush(new TextWebSocketFrame(" 自己 " ));
}
});
}
// 客户端建立连接
@Override
public void handlerAdded (ChannelHandlerContext ctx) throws Exception{
System.out .println(" 客户端建立连接 --- " + ctx.channel().id() );
// 添加 channels
clients .add(ctx.channel());
}
@Override
public void exceptionCaught (ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out .println(" 异常 --- " + ctx.channel().id());
ctx.channel().close();
clients .remove(ctx.channel());
}
}
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。