2012-03-14 51 views
2

是否有一個非常準確的Netty處理程序的例子,它只需獲取任何數據在線路上發送並將其寫入文件?簡單的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")); 
    } 
});