当前位置: 首页 > 知识库问答 >
问题:

channelRead0没有被称为Netty

石思淼
2023-03-14

我有一个服务器-客户端应用程序不工作。这是代码:ChatServerHandler

public static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

public static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

@Override
public void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf buf) {
    Channel incoming = channelHandlerContext.channel();
    for (Channel channel : channels) {
        if (channel != incoming){
            System.out.println(buf);
            channel.writeAndFlush("[" + incoming.remoteAddress() + "]" + buf + "\r\n");
        }
    }
    buf.release();
}

@Override
public void handlerAdded(ChannelHandlerContext ctx) {
    Channel incoming = ctx.channel();
    for (Channel channel : channels) {
        channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " has joined" + "\r\n");
    }
    channels.add(incoming);
}

@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
    Channel incoming = ctx.channel();
    for (Channel channel : channels) {
        channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " has left" + "\r\n");
    }
    channels.remove(incoming);
}

ChatServerInitializer

@Override
protected void initChannel(SocketChannel channel) {
    ChannelPipeline pipeline = channel.pipeline();
    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
    pipeline.addLast("decoder", new StringDecoder());
    pipeline.addLast("encoder", new StringDecoder());
    pipeline.addLast("handler", new ChatServerHandler());
}
public ChatServer(int port){
    this.port = port;
}

public void run() throws Exception{
    EventLoopGroup boosGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    try {
        ServerBootstrap bootstrap = new ServerBootstrap()
                .group(boosGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChatServerInitializer());
        bootstrap.bind(port).sync().channel().closeFuture().sync();
    }finally {
        boosGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();
    }
}
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) {
    System.out.println(s);
}
@Override
protected void initChannel(SocketChannel channel) {
    ChannelPipeline pipeline = channel.pipeline();
    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
    pipeline.addLast("decoder", new StringDecoder());
    pipeline.addLast("encoder", new StringEncoder());
    pipeline.addLast("handler", new ChatClientHandler());
}
public void run() {
    EventLoopGroup group = new NioEventLoopGroup();
    try {
        Bootstrap bootstrap  = new Bootstrap()
                .group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChatClientInitializer());
        Channel channel = bootstrap.connect(host, port).sync().channel();
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            channel.write(in.readLine() + "\r\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        group.shutdownGracefully();
    }
}

只是要提一下,其他一切都很好,信息只是没有收到。试图使用println在channelRead打印某些内容将不起作用。所以我知道它不会被打电话。另外,对不起,如果我不应该在这里发布整个代码,但我只是没有想法。

共有1个答案

贺波
2023-03-14

您需要使用writeandflush(in.readline()+“\r\n”);,否则它不会“刷新”到基础套接字。

 类似资料:
  • 这是我房子里的sonarqube房产。Gradle 如果我缺少任何属性或需要任何进一步的配置,请让我知道。

  • 可能重复:< br >什么是复制省略和返回值优化? 我很难理解为什么在下面的代码中没有调用复制构造函数。 有人能解释一下为什么只调用构造函数,不调用复制构造函数吗?< br >谢谢。

  • 这是为编写的: 有界队列。当与有限的maximumPoolSizes一起使用时,有界队列(例如ArrayBlockingQueue)有助于防止资源耗尽,但可能更难调优和控制。队列大小和最大池大小可以相互权衡:使用大队列和小池可以最大限度地减少CPU使用量、OS资源和上下文切换开销,但可能会导致人为的低吞吐量。如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能能够为更多的线程安排时间,而不是

  • Netty重写SimpleChannelInboundHandler后的ChannelRead0方法从未被调用? 希望结果:重写后的方法【RpcRequestHandler#channelRead0】每次有新请求都被调用

  • 因此,我的问题是:为什么还没有被否决?如果核心Java团队已经决定它是坏的,那么他们一定也考虑过弃用。他们反对这样做的理由是什么(在Java8中,它仍然没有被反对)?

  • 今天我开始玩分支,检查两个布尔值。我很确定,在某些优化级别上,它们将简单地添加并检查,但gcc和CLANG不是这样。为什么gcc不优化两个bool检查,用addition和一个check替换它们?让我给你看一个例子: 两个分支(test+je)不应该比加法和分支(add+jne)慢吗? 编辑:我真正的意思是乘法,因为在true和false的情况下(1+0),加法给出true(1),但乘法给出正确的