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

Netty服务器消息无法发送到客户端

咸育
2023-03-14

我正在试用netty,但当我响应时,客户端似乎没有收到我的消息。我使用Java NIO和socketChannel编写了相同的代码,看起来很好。我这样说是因为客户机会记录我发送的任何内容。下面是我的服务器

public class Server{

    public void init(final int port){

    EventLoopGroup bossGroup = new NioEventLoopGroup(1);  
    EventLoopGroup workerGroup = new NioEventLoopGroup(); 

    try {

        ServerBootstrap bootstrap = new ServerBootstrap();
        bootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_REUSEADDR, true)
                .handler(new LoggingHandler(LogLevel.INFO))
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) {
                        ChannelPipeline p = ch.pipeline();
                        p.addLast(new ServerHandler());
                    }
                })

                .option(ChannelOption.SO_BACKLOG, 128)
                .childOption(ChannelOption.SO_KEEPALIVE, true);

        ChannelFuture f = bootstrap.bind("localhost", port).sync(); 

        f.channel().closeFuture().sync(); 

    } catch (InterruptedException e) {
        System.out.println("Server encountered an InterruptedException");
        e.printStackTrace();

    } finally {
        workerGroup.shutdownGracefully();
        bossGroup.shutdownGracefully();
    }
}

下面是我的服务器处理程序

public class ServerHandler extends ChannelInboundHandlerAdapter {

public static Logger LOG =  LoggerFactory.getLogger(UTPServerHandler.class);
final int LEN = 1028;
private ByteBuf byteBuf;
private MyDecoder myDecoder;

@Override
public void handlerAdded(ChannelHandlerContext ctx) {
    byteBuf     = ctx.alloc().buffer(MAX_PACKET_LENGTH);
    myDecoder = new MyDecoder();
}

@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
    byteBuf.release();
    byteBuf = null;
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {

    byteBuf = (ByteBuf) msg;
    myDecoder.decodeMessage(byteBuf, ctx); //This is where I try to decode which message and respond. I pass ctx along so I know which to reponsd to. See sample response below
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    cause.printStackTrace();
    System.out.println"Got an exception...");
    ctx.close();
}

}

示例响应:

 public static void dummyResponse(ChannelHandlerContext ctx, int test){

    ByteBuf response = Unpooled.buffer(32);
    response.writeByte(test);
    response.writeByte(test);
    response.writeByte(test);
    response.writeByte(test);
    response.writeByte(test);      
    ctx.channel().writeAndFlush(response);
}

我正在我的盒子上做一个tcpdump,我看到了我在电线上发送的内容,所以我不确定我做错了什么。而且,几分钟后,这会被记录下来,我不确定我在服务器或服务器处理程序中做了什么来抱怨这一点:

共有1个答案

谢泉
2023-03-14

您会得到一个关于释放的消息,因为您在handlerAdded方法中分配了一个ByteBuf并将其分配给ByteBuf,然后在channelRead中将ByteBuf分配给传入的消息,导致第一个消息被垃圾收集而没有被释放。通过不在HandlerAdded中分配它来修复此问题。

 类似资料:
  • 我有一个netty服务器和客户端在项目中,希望他们之间交换消息。 服务器处理程序代码: 客户端处理程序代码: MessageDecoder代码: 服务器输出如下: 客户端输出如下: 所以从日志的输出可以看出,客户端向服务器端发送了10条消息,而服务器端只接收到一条消息。我的代码有什么问题吗?我想也许是我误用的原物?

  • 问题内容: 这实际上是我在这里的第一篇文章,一段时间以来我一直在试图弄清楚这一点,但是我终于打电话给该旗帜,并将尝试寻求有关此主题的一些帮助。 因此,我有一个客户端和一个服务器,它们是根据回显客户端/服务器和安全聊天客户端/服务器建模的。我对聊天的SSL部分和使用回显仅对确保我在客户端/服务器之间收到响应不感兴趣。我将在这篇文章的底部添加所有相关代码。我现在遇到的问题是,在客户端连接后,我可以从服

  • 当我提交表单时,我在浏览器控制台中看到“emit”消息,所以我知道表单提交事件正在触发,但我没有在服务器上收到测试消息。客户端或服务器端似乎什么也没发生,“socket.emit”函数似乎什么也没做。 我做错了什么?

  • 我有一个Netty客户端和一个Netty服务器,并按照主要教程后,为了有一个EchoClient/服务器,我想让它,使我的客户端发送消息到我的服务器,当他第一次连接到它。 下面是我的的方法,这些方法应该解决这个问题: 但是正如你所看到的,教程使用了一个ByteBuf和一个String似乎不起作用! 下面是我如何在我的方法中显示收到的消息: 但是当为使用并在构造函数中初始化它并发送它时,我的服务器不

  • 我用netty编写了一个应用程序,客户端用channelActive方法向服务器端发送字符串消息,而服务器端没有接收到字符串消息。我不知道原因。 服务器代码: 我用服务器处理程序的方法ChannelRead打印来自客户端的消息。 以下是客户端代码: 我从通道活动的客户端发送消息,但服务器没有接收消息,字符串“message from client”

  • 我有一个使用Netty用Java设计的非常简单的服务器。我还使用Java NIO包编写了一个简单的客户端。我可以将Netty服务器与客户端连接起来,但当消息发送到服务器时,我会遇到以下例外情况: 我的输出: 我的服务器程序: 我的ServerHandler: 我的NIO Java客户端: 2)我正在使用LengthFieldBasedFrameDecoder和LengthPrepender来消除半