Socket(Tcp)传输在流前面加标识

来源:互联网 发布:手机赚钱软件 编辑:程序博客网 时间:2024/05/16 16:21

开发中遇到一个这样的需求,两台手机建立一个局域网进行Tcp传输数据,其中需要传输 字符串、bitmap、xml文件等等。。。因为是不同类型的数据所以在服务端接收的时候需要用不同的解析方式来解析此次得到的流,所以这里就存在一个蛋疼的问题我要怎么知道此次传输的是什么类型的数据呢?这就是本篇博客要讲的在流前面加标识。

1.所未添加标识,也就是自己定义一个协议来约束传输行为,按照自己定义的规则来执行。如果对Socket不太熟悉的可以看下这篇博客,看下发送端

Socket s = new Socket(serverAddress, 10086);OutputStream out = s.getOutputStream();out.write("1#启动成功".getBytes());//1#就是我们加的标识s.close();

2.接收端

ServerSocket ss = new ServerSocket(10086);Socket accept = ss.accept(); //3.获取客户端发送过来的数据InputStream in = accept.getInputStream();int count = 0;while (count == 0) {//获取流的长度    count = in.available();} String flag = getBodyLength(in);//获取流前面的标识 //这里的flag就会是我们的1#了,那我们就可以使用对应的解析方式了 //继续解析也就只能获取标识后面的数据了,这也正式我们想要的 switch (flag) {    case "1#"://解析字符串        pullString(in);        break;    case "2#"://解析图片        pullBitmap(in);        break;

public final int headerBufferSize = 2;//每次要读取流头部的长度public synchronized String getBodyLength(InputStream is) throws IOException {        byte[] b = readIs2(is, headerBufferSize);        return new String(b, "UTF-8");    }public synchronized byte[] readIs2(InputStream is, int len) throws IOException {        byte[] data = new byte[len];        int i = 0;        while (i < len) {            int r = is.read(data, i, len - i);            if (r <= 0) {                return data;            }            i = i + r;        }        return data;    }

这里再提供一个方法,将两个字节数组合并为一个字节数组

//合并和的效果就是,把bytes_1放在最前面,bytes_2在后面public static synchronized byte[] mergerByte(byte[] bytes_1, byte[] bytes_2) {        byte[] bytes = new byte[bytes_1.length + bytes_2.length];        System.arraycopy(bytes_1, 0, bytes, 0, bytes_1.length);        System.arraycopy(bytes_2, 0, bytes, bytes_1.length, bytes_2.length);        return bytes;    }

如果帮到了你就动个小指顶一下吧

3 0
原创粉丝点击