Posted on 2007-12-20 11:40
帥子 閱讀(895)
評論(0) 編輯 收藏 所屬分類:
J2EE技術專區
在網絡編程中,我們經常要組建自己的網絡協議,通常我們把數據按照協議組成byte數組,通過byte數組實現客戶端與服務器端的通信,我們可能通過兩種方法來組這個byte數組:
1、是通過ByteArrayOutputStream:
ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos.write(data.getBytes());
byte [] ret = baos.toByteArray();
2、是通過ByteBuffer:
在使用ByteBuffer時,我們要使用一個小技巧:因為我們發送的數據長度是不固定的,所以我們不能給ByteBuffer分配固定的容量,如果分配固定的容易,一方面可能造成內存的浪費,另外一方面有可能我們寫的數據會超出ByteBuffer的容量。所以我們在申請ByteBuffer空間時,先計算其數據長度:
如果是byte,short,int,long等類型的數據我們都好計算;
如果是String的話,我們先獲取其getBytes(),然后計算其長度。
例子:
byte [] bs=null;
byte len = 0;
try {
bs="直播員".getBytes("GBK");
len = (byte) bs.length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return result;
}
short datalen=(short) (2+4+4+1+bs.length+4+4+4+1+1);//后續數據長度
ByteBuffer w_buff = ByteBuffer.allocate(datalen+2);//申請ByteBuffer
//接下來往ByteBuffer填充數據
w_buff.putShort(Short.reverseBytes(datalen));
short c=0X0416;
w_buff.putShort(Short.reverseBytes(c));//登錄命令號
w_buff.putInt(Integer.reverseBytes(111));
w_buff.putInt(Integer.reverseBytes(2222));
w_buff.put(len);//昵稱的長度
w_buff.put(bs);//昵稱
w_buff.putInt(Integer.reverseBytes(1));//等級
w_buff.putInt(Integer.reverseBytes(1));//用戶權限
w_buff.putInt(Integer.reverseBytes(1));//用戶頭像
byte sex=0;
w_buff.put(sex);//用戶性別
byte age=20;
w_buff.put(age);//用戶年齡
byte [] ret=w_buff.array();
我個人比較喜歡用第二種方法,因為它的效率比第一種要高出一到兩倍呢。
而且第二種方法可以不用自己去把short,int,long等類型的數據轉換成byte數組(這可是以麻煩的過程呀)。