Netty - 发送失败:UnsupportedOperationException:不支持的消息类型

时间:2017-04-30 14:42:49

标签: 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();

ServerHandler:

@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());
}

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

1 个答案:

答案 0 :(得分:1)

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

顺便说一下,您在执行writeAndFlush(..)后立即尝试检查channelFuture.isSuccess()。因为Netty是完全异步的,所以此测试将失败,因为channelFuture既不成功也不失败。您必须等到CF完成后才能致电cf.await()cf.awaitUninterruptibly()