使用netty的对象解码器丢失服务器回复/错误

时间:2014-01-01 03:43:44

标签: tcp netty vpn

我有一个非常简单的netty应用程序,它既可以作为服务器,也可以作为客户端。

客户端使用channel.writeAndFlush()向服务器发送请求,然后在monitor.wait()上阻止。

channelRead()中的客户端的InboundAdapter中,我找到了相应的监视器并执行monitor.notify()以让请求客户端线程继续处理服务器的回复。

在ChannelHandler的channelRead()服务器上,我执行以下操作:

为了限制正在处理的请求数量,我提交了一个任务,它将真正的工作作为现有EventLoop的新任务:ctx.executor().submit(new Task())。我执行了大量的IO操作,之后我writeAndFlush()将结果返回给客户。

这是我的管道设置:

new ObjectEncoder(), 
new ObjectDecoder(LibConstants.Search.MAX_REQUIEST_SIZE, ClassResolvers.cacheDisabled(null))

这是bootstrap配置:

new ServerBootstrap()
   .channel(NioServerSocketChannel.class)
   .option(ChannelOption.SO_BACKLOG, 1000)
   .option(ChannelOption.SO_KEEPALIVE, true)

我有两个问题:

  1. 当收到服务器的回复时,我经常在客户端上获得io.netty.handler.codec.DecoderException: java.io.UTFDataFormatException。我找不到任何明显的理由。由于我的管道设置非常简单。
  2. 服务器的回复不会出现在客户端上。我在日志中看到服务器上的成功刷新,但回复从未到达客户端。这很难处理,因为我的应用程序对延迟非常敏感。我设置的任何超时都会破坏我的用户体验。 这一切都发生在VPN网络上,因此VPN设备可能会以某种奇怪的方式行为不端,但我希望TCP可以处理通道中可能发生的任何类型的数据包丢失/损坏。
  3. 非常感谢您分享的任何建议或经验!

0 个答案:

没有答案