IntegerHeaderFrameEncoder.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package net.dnio.codec.intheader;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.jboss.netty.buffer.ChannelBuffer;
  5. import org.jboss.netty.buffer.ChannelBuffers;
  6. import org.jboss.netty.channel.Channel;
  7. import org.jboss.netty.channel.ChannelHandlerContext;
  8. import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
  9. /**
  10. *
  11. * <p>
  12. * 该类会在消息头部写上一个标识消息长度的int的值。
  13. * 用于在接收端识别消息的总长度,从而得到一个完整的消息体。
  14. * </p>
  15. *
  16. *
  17. * <p>
  18. * 因为Netty是异步发送和接收消息, 接收端每次只能接收1024字节的数据。
  19. * 因此超过1024字节的消息会被分割。利用次消息头则可以获得的完整的消息
  20. * </p>
  21. *
  22. * <pre>
  23. *
  24. * Created by IntelliJ IDEA.
  25. * User: zhenqin
  26. * Date: 13-6-4
  27. * Time: 下午8:10
  28. * To change this template use File | Settings | File Templates.
  29. *
  30. * </pre>
  31. *
  32. * @author zhenqin
  33. */
  34. public class IntegerHeaderFrameEncoder extends OneToOneEncoder {
  35. /**
  36. * 日志记录
  37. */
  38. private static Log log = LogFactory.getLog(IntegerHeaderFrameEncoder.class);
  39. public IntegerHeaderFrameEncoder() {
  40. }
  41. @Override
  42. public Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
  43. if (!(msg instanceof ChannelBuffer)) {
  44. return msg;
  45. }
  46. //取得消息正文
  47. ChannelBuffer body = (ChannelBuffer) msg;
  48. //构造一个和原消息等长的消息, 并且加上一个int所占用的内存
  49. ChannelBuffer buffer = ChannelBuffers.buffer(body.capacity() + 4);
  50. //写入消息长度
  51. buffer.writeInt(body.writerIndex());
  52. //写入消息
  53. buffer.writeBytes(body);
  54. //返回一个构造的完整的消息
  55. return buffer;
  56. }
  57. }