Netty - 发送失败:UnsupportedOperationException:不支持的消息类型
Netty - Send failed: UnsupportedOperationException: unsupported message type
我正在使用 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 没有实现 Serializable 接口。根据文档,ObjectEncoder 仅支持可序列化对象:class ObjectEncoder
extends MessageToByteEncoder<Serializable>
.
顺便说一下,您正在尝试在执行 writeAndFlush(..) 后立即检查 channelFuture.isSuccess()。因为 Netty 是完全异步的,所以这个测试会失败,因为 channelFuture 既没有成功也没有失败。您必须等待 CF 通过调用 cf.await()
或 cf.awaitUninterruptibly()
.
完成
我正在使用 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 没有实现 Serializable 接口。根据文档,ObjectEncoder 仅支持可序列化对象:class ObjectEncoder
extends MessageToByteEncoder<Serializable>
.
顺便说一下,您正在尝试在执行 writeAndFlush(..) 后立即检查 channelFuture.isSuccess()。因为 Netty 是完全异步的,所以这个测试会失败,因为 channelFuture 既没有成功也没有失败。您必须等待 CF 通过调用 cf.await()
或 cf.awaitUninterruptibly()
.