Java网络通讯之数据的传输(二)

       上一篇文章,我们已经提出一个方案,先把对象转成json格式的文件,然后再把json格式的文本转成二进制传输。现在介绍比较专业的数据传输方式,对象直接编码为二进制。

      首先,我们先来了解一下数据的二进制编码。对所有基本数据类型都可以转yte[],例如:long -> byte[8]           int   -> byte[4]     short ->  byte[2]   double -> byte[8]    float -> byte[4]   boolean ->byte[1] ,在Java中,我们可以ByteBuffer这个类对数据进行二进制编码,用法如下所示:

		ByteBuffer buf = ByteBuffer.allocate(1000);
		
		//放入数据
		buf.putInt(1234);
		buf.putDouble(33.44);
		
		//查看编码后的结果
		int size = buf.position();//已经编码的字节数
		byte[] array = buf.array();//获得ByteBuffer的内部数组

上面是编码的过程,那么如何对其进行解码呢,上面我们放入一个int类型和一个double类型的数据,解码的时候调用get方法将其取出即可,代码如下:

buf.getInt();
buf.getDouble();

我们讲完数据的二进制编码,下面我们说说如何将对象进行而二进制编码,复杂对象的二进制,就是把它的各个字段进行二进制编码,例如有如下的对象:

public class Student
{
	public int id;
	public String name;
	public boolean sex;
	public String cellphone;
	
	public Student()
	{		
	}
	public Student(int id , String name, boolean sex, String cellphone)
	{
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.cellphone = cellphone;
	}
	@Override
	public String toString()
	{
		return "学号: " + id 
				+ ",姓名: " + name 
				+ ",性别: " + ( sex ? "男": "女")
				+ ",手机: " + cellphone
				;
	}
	
	
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public boolean isSex()
	{
		return sex;
	}
	public void setSex(boolean sex)
	{
		this.sex = sex;
	}
	public String getCellphone()
	{
		return cellphone;
	}
	public void setCellphone(String cellphone)
	{
		this.cellphone = cellphone;
	}
}

我们将其进行二进制编码,就是把各个字段进行二进制编码,具体编码和解码如下:

package my;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

public class Test
{

	public static int encode(Student stu , byte[] data) throws UnsupportedEncodingException
	{
		ByteBuffer bbuf = ByteBuffer.wrap(data);
		//id编码
		bbuf.putInt(stu.id);
		//name
		byte[] strbuf = stu.name.getBytes("UTF-8");
		bbuf.putShort((short)strbuf.length);
		bbuf.put(strbuf);
		
		//sex
		bbuf.put(stu.sex?(byte)1:(byte)0);
		
		//cellphone
		strbuf = stu.cellphone.getBytes("UTF-8");
		bbuf.putShort((short)strbuf.length);
		bbuf.put(strbuf);
		return bbuf.position();
	}
	public static Student decode(byte[] data , int n) throws UnsupportedEncodingException
	{
		ByteBuffer bbuf = ByteBuffer.wrap(data);
		Student stu = new Student();
		
		//id
		stu.id = bbuf.getInt();
		
		
		//name
		byte[] strbuf = new byte[1000];
		int strlen = bbuf.getShort();//
		bbuf.get(strbuf, 0, strlen);
		stu.name = new String(strbuf ,0 , strlen , "UTF-8");
		//sex
		stu.sex = (bbuf.get() != 0);
		strlen = bbuf.getShort();
		bbuf.get(strbuf, 0, strlen);
		stu.cellphone = new String(strbuf , 0 , strlen , "UTF-8");
		return stu;
	}
	public static void main(String[] args) throws UnsupportedEncodingException
	{
		// 
		byte[] data = new byte[1000];
		
		// 
		Student s1 = new Student();
		s1.id = 20190001;
		s1.name = "小明";
		s1.sex = true;
		s1.cellphone = "13810012345";
		
		// encodeֵ
		int n = encode(s1, data);
		
		Student s2 = decode(data, n);
		
		System.out.println(s2.toString());
		System.out.println("\nexit");

	}

}

以上得到对象的二进制的编码和解码,然后就可以进行数据的传输。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndyWei147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值