Netty Framework:UDP发送海量数据

时间:2012-08-17 15:13:13

标签: udp netty

使用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方法结束了,而不是一击。不幸的是,我不知道,并希望得到一个提示。

1 个答案:

答案 0 :(得分:0)

你需要尽快从channelBound返回,因为你在那里运行所有代码来阻止Netty的I / O线程。

您应该使用Executor(或Netty库中的等效内容,如果存在)来执行长时间运行的代码(在本例中为dataReader循环),以便Netty的一个线程并没有阻止等待你的代码完成。