2012-03-14 2 views
2

Есть ли пример обработчика Netty очень barebone, который просто получает любые данные, отправленные на провод, и записывает их в файл?Простой обработчик 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 
} 

Любые идеи? Спасибо за любые мысли

ответ

4

Вы также можете просто использовать этот метод, чтобы передать содержание 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

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

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")); 
    } 
}); 
Смежные вопросы