Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内蒂没有';不写_Java_Netty - Fatal编程技术网

Java 内蒂没有';不写

Java 内蒂没有';不写,java,netty,Java,Netty,当尝试使用netty写入时,写入的数据永远不会在远程端结束,这一点由Wireshark确认 我试过: //Directly using writeAndFlush channel.writeAndFlush(new Packet()); //Manually flushing channel.write(new Packet()); channel.flush(); // Even sending bytes won't work: channel.writeAndFlush(new byt

当尝试使用netty写入时,写入的数据永远不会在远程端结束,这一点由Wireshark确认

我试过:

//Directly using writeAndFlush
channel.writeAndFlush(new Packet());

//Manually flushing
channel.write(new Packet());
channel.flush();

// Even sending bytes won't work:
channel.writeAndFlush(new byte[]{1,2,3});
try{…}catch(Throwable e){e.printStackTrace();}


如何调试此问题?

Netty是异步的,这意味着当写入失败时它不会抛出异常。它不会抛出异常,而是返回一个
未来
,当请求完成时将更新它。确保将由此产生的任何异常记录为第一个调试步骤:

channel.writeAndFlush(...).addListener(new GenericFutureListener<Future<Object>>() {
    @Override
    public void operationComplete(Future<Object> future) {
        // TODO: Use proper logger in production here
        if (future.isSuccess()) {
            System.out.println("Data written succesfully");
        } else {
            System.out.println("Data failed to write:");
            future.cause().printStackTrace();
        }
    }
});
找到异常的根本原因后,可能会出现多个问题:

java.lang.UnsupportedOperationException:

不支持的消息类型:(应为:…)
注意:在使用时也会抛出,但您的对象不会实现

默认Netty频道只能发送
ByteBuf
s和
FileRegion
s。您需要将对象转换为这些类型,方法是向管道中添加更多处理程序,或者手动将它们转换为
ByteBuf
s

ByteBuf
是字节数组的净变体,但由于它可以存储在直接内存空间中,因此具有潜在的性能

通常使用以下处理程序:

要转换
字符串
请使用
StringEncoder
要转换可序列化的
文件,请使用
ObjectEncoder
(警告,与普通Java对象流不兼容) 要转换
字节[]
请使用
ByteArrayEncoder


注意:由于TCP是一种基于流的协议,您通常需要附加某种形式的数据包大小,因为您可能无法接收您编写的确切数据包。有关更多信息,请参见Netty wiki中的。Netty是异步的,这意味着当写入失败时它不会抛出异常。它不会抛出异常,而是返回一个
未来
,当请求完成时将更新它。确保将由此产生的任何异常记录为第一个调试步骤:

channel.writeAndFlush(...).addListener(new GenericFutureListener<Future<Object>>() {
    @Override
    public void operationComplete(Future<Object> future) {
        // TODO: Use proper logger in production here
        if (future.isSuccess()) {
            System.out.println("Data written succesfully");
        } else {
            System.out.println("Data failed to write:");
            future.cause().printStackTrace();
        }
    }
});
找到异常的根本原因后,可能会出现多个问题:

java.lang.UnsupportedOperationException:

不支持的消息类型:(应为:…)
注意:在使用时也会抛出,但您的对象不会实现

默认Netty频道只能发送
ByteBuf
s和
FileRegion
s。您需要将对象转换为这些类型,方法是向管道中添加更多处理程序,或者手动将它们转换为
ByteBuf
s

ByteBuf
是字节数组的净变体,但由于它可以存储在直接内存空间中,因此具有潜在的性能

通常使用以下处理程序:

要转换
字符串
请使用
StringEncoder
要转换可序列化的
文件,请使用
ObjectEncoder
(警告,与普通Java对象流不兼容) 要转换
字节[]
请使用
ByteArrayEncoder

注意:由于TCP是一种基于流的协议,您通常需要附加某种形式的数据包大小,因为您可能无法接收您编写的确切数据包。有关更多信息,请参阅Netty wiki中的