java - Netty - 发送失败 : UnsupportedOperationException: unsupported message type

标签 java netty

我正在使用 Netty 4.1.9 编写服务器客户端应用程序。

最近我成功地使用ByteBuf进行了通信。 然后尝试使用 String 并再次成功。

但是在最后一步我想发送自定义对象,但我的问题是:

Send failed: java.lang.UnsupportedOperationException: unsupported message type: GIdPacket (expected: ByteBuf, FileRegion)

一些代码部分

服务器:

ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
             ch.pipeline().addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));
             ch.pipeline().addLast(new ObjectEncoder());
             ch.pipeline().addLast(new ServerHandler());
             ch.pipeline().addLast(loggingHandler);
         }
     })
    .option(ChannelOption.SO_BACKLOG, 128)
    .childOption(ChannelOption.SO_KEEPALIVE, true)
    .option(ChannelOption.AUTO_READ, true);

ChannelFuture f = b.bind(port).sync();

服务器处理程序:

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception
{
    System.out.println("CHANNEL >> channelActive fired");
    clientData = new ClientData(Server.newId(), ctx.channel());
    Server.clients.put(clientData.id, clientData);

    GIdPacket packet = new GIdPacket(/*some init atr*/);

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

    Log.out(packet.toString());
}

所以,我尝试了很多不同的选择。我花了很多时间,但没有找到解决方案。任何帮助表示赞赏。

最佳答案

看起来 GIdPacket 没有实现 Serialized 接口(interface)。根据文档,ObjectEncoder 仅支持可序列化对象:class ObjectEncoder extends MessageToByteEncoder<Serializable> .

顺便说一句,您试图在执行 writeAndFlush(..) 后立即检查channelFuture.isSuccess()。因为 Netty 是完全异步的,所以这个测试将会失败,因为 ChannelFuture 既没有成功也没有失败。您必须通过调用 cf.await() 等待 CF 完成。或cf.awaitUninterruptibly() .

关于java - Netty - 发送失败 : UnsupportedOperationException: unsupported message type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43707617/

相关文章:

java - 服务器端计时器消息发送到浏览器

java - 检查字节数组列表是否包含新的字节数组

java - 使用 Bouncy CaSTLe 解密 PEM 私钥 (RSA)

java - 带有单个字母的正则表达式无法识别

java - 理解netty中的DelimeterDecoder

java - 使用netty库,服务器无法处理客户端重连场景

netty - 如何在 Netty 4 中处理 PING/PONG 帧?

java - 无法解析对值 :$akka. 的替换 stream-blocking io dispatcher

java - Netty 套接字 SSLHandshakeException WRONG_VERSION_NUMBER

java - 如何忽略来自断开连接的 channel 的消息