Posted on 2007-12-20 11:40
帅子 阅读(889)
评论(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数组(这可是以麻烦的过程呀)。