使用Netty 3.5.3我正在实现一个UDP服务器,它必须连续发送小数据包,而不需要任何请求 - 响应通信。在论坛中的任何地方我发现提示最好的钩子是覆盖SimpleChannelHandler的channelBound方法。
private static class MyHandler extends SimpleChannelHandler {
private TargetDataReader dataReader = new TargetDataReader();
private InetSocketAddress remoteAddress;
private long sleep;
/**
* @param host
* @param port
*/
public MyHandler(String host, int port, long sleep) {
super();
this.remoteAddress = new InetSocketAddress(host, port);
this.sleep = sleep;
}
/*
* {@inheritDoc}
*/
@Override
public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
Channel ch = e.getChannel();
int cnt = 0;
long start = System.currentTimeMillis();
byte[] targetData;
while ((targetData = dataReader.nextData()) != null) {
ChannelBuffer tdBuf = ChannelBuffers.wrappedBuffer(targetData);
++cnt;
ChannelFuture cf = ch.write(tdBuf, this.remoteAddress);
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
System.out.println("Server - record sent "
+ (future.isSuccess() ? "successfully" : "failed"));
}
});
cf.await(30);
if (sleep > 0)
Thread.sleep(sleep);
System.out.println("Server - written records " + cnt);
}
long duration = System.currentTimeMillis() - start;
System.out.println("Server - duration=" + duration + ", cnt=" + cnt + ", records/sec="
+ String.format("%f", ((double) cnt) / duration * 1000));
}
乍一看似乎有效。但是看得更深,我意识到接收客户端只获得了大约50%的数据包。此外,我认为这是实际问题,服务器在调用 ChannelFuture cf = ch.write(tdBuf,this.remoteAddress); 时不会真正发送数据包,但直到channelBound方法结束了,而不是一击。不幸的是,我不知道,并希望得到一个提示。
答案 0 :(得分:0)
你需要尽快从channelBound
返回,因为你在那里运行所有代码来阻止Netty的I / O线程。
您应该使用Executor
(或Netty库中的等效内容,如果存在)来执行长时间运行的代码(在本例中为dataReader
循环),以便Netty的一个线程并没有阻止等待你的代码完成。