Простой обработчик Netty, перебирать сообщения побайтно - PullRequest
2 голосов
/ 14 марта 2012

Есть ли пример очень простого обработчика Netty, который просто получает все данные, отправленные по проводам, и записывает их в файл?

Я думал о чем-то вроде этого:

public class SimpleHandler extends SimpleChannelUpstreamHandler {

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        HttpRequest request = (HttpRequest) e.getMessage();
        // get data from request and write to a file
}

Есть идеи?Спасибо за любые мысли

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Вы также можете просто использовать этот метод для передачи содержимого ChannelBuffer в OutputStream:

http://netty.io/docs/stable/api/org/jboss/netty/buffer/ChannelBuffer.html#readBytes(java.io.OutputStream,%20int)

Так что-то вроде этого:

public class FileWriterHandler extends SimpleChannelHandler {
    private final String filename;

    public FileWriterHandler(String filename) {
        this.filename = filename;
    }

    @Override
    public void messageReceived(ChannelHandlerContext context, MessageEvent event) throws Exception{
        ChannelBuffer buffer = (ChannelBuffer)event.getMessage();
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(filename, true)
            buffer.readBytes(out, buffer.readableBytes());
        } finally {
            if (out != null) out.close();
        }
    }
}   
2 голосов
/ 15 марта 2012

Я написал один из них для тестирования некоторое время назад:

public class FileWriterHandler extends SimpleChannelHandler {
    private final String filename;

    public FileWriterHandler(String filename) {
        this.filename = filename;
    }

    @Override
    public void messageReceived(ChannelHandlerContext context, MessageEvent event) {
        ChannelBuffer buffer = (ChannelBuffer)event.getMessage();
        byte[] bytes = new byte[buffer.readableBytes()];
        buffer.readBytes(bytes);
        try {
            DataOutputStream stream = new DataOutputStream(new FileOutputStream(filename, true));
            stream.write(bytes, 0, bytes.length);
            stream.flush();
            stream.close();
        } catch (IOException ex) {
            throw runtime(ex);
        }
    }
}

Это просто для проверки, поэтому я просто перебрасываю исключения и не совсем правильно с ними работаю Надеюсь, что это полезно.

Вы бы настроили это следующим образом:

ServerBootstrap bootstrap = initializedSomehow();
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    @Override
    public ChannelPipeline getPipeline() {
        return pipeline(new FileWriterHandler("yourfile.txt"));
    }
});
...