java - Netty channel.write 不写消息

标签 java sockets jboss network-programming netty

我正在尝试使用 Netty 迈出第一步,为此我在 Netty 上编写了简单的服务器,在 oio 纯 TCP 上编写了简单的客户端。

客户端发送随机文本包,必须收到“Ack”消息。 查看处理程序方法:

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

    ctx.write("Ack"); 
    ctx.flush();

    ByteBuf in = (ByteBuf) msg;
    StringBuilder sb = new StringBuilder();
    try {
        while (in.isReadable()) {
            sb.append((char) in.readByte());

        }
    } finally {
        ReferenceCountUtil.release(msg);
    }
    LOG.debug("Incoming message. ACK was send");

    String myaddr = ctx.channel().remoteAddress().toString();
    String message = "Message from " + myaddr + " :" + sb.toString();
    LOG.debug(message);
    sendToOther(myaddr, message);

}

问题是 - 当我尝试发回“Ack”字符串时 - 客户端什么也没收到。 但是当我尝试发回传入的消息时 - 它工作正常,并且我在我的客户端中看到了回声。

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

    ctx.write(msg); 
    ctx.flush();

write() 方法需要 Object 并且我尝试发送 (Object) String - 但什么也没发生。 我还尝试发送 ByteBuf(我在一篇文章中看到过)但它仍然无法正常工作。

当我将收到的消息作为回显发回时 - 它起作用了。当我发送其他东西时 - 它没有。请帮助我,我不知道我的错误在哪里。


我解决了这个问题。重点是,您只需要发送 ByteBuff。所以我们需要创建它,并向它写入一些东西,然后我们才能将它写入香奈儿管道。就我而言,它就像:

String ack = "ACK";
    ByteBuf out = ctx.alloc().buffer(ack.length()*2);
    out.writeBytes(ack.getBytes());
    ctx.write(out); 
    ctx.flush();
    LOG.debug("Incoming message. ACK was send");

可能这不是很好的解决方案,但它可以作为示例。

最佳答案

如果你更换你的,你就会明白为什么它会失败

ctx.write("Ack"); 
ctx.flush();

在您的 serverHandler 中使用以下内容:

ChannelFuture cf = ctx.write("Ack");
ctx.flush();
if (!cf.isSuccess()) {
    System.out.println("Send failed: " + cf.cause());
}

它应该给你一条消息说 String 不受支持。

ByteBuf 应该可以工作:

ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8));
ctx.flush();

在客户端编辑 channelRead 方法:

ByteBuf in = (ByteBuf) msg;
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));

关于java - Netty channel.write 不写消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25760764/

相关文章:

java - 将 Curl 转换为 Java

java - 无法初始化类 org.jfree.chart.JFreeChart

multithreading - 即时通讯服务器设计

java - 无法在 org.kie :kie-api:jar:6. 4.0.Final 处收集依赖项:

java - JBoss Developer Studio 与 MySQL 的集成问题

java - 如何使用Netbeans单步执行程序?

java - 将两个 BufferedImages 并排复制到一个图像中

java - 在java中的二维网格数组中绘制圆圈

Java 代理 - 无法接收来自主机/套接字问题的响应

c++ - 使用 Accept() 的 Boost 线程中的性能/优先级 (Linux)