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

开发中遇到一个这样的需求,两台手机建立一个局域网进行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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Code-Porter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值