码迷,mamicode.com
首页 > Web开发 > 详细

WebSocket传输超过126字节数据的方法

时间:2016-04-21 12:00:05      阅读:702      评论:0      收藏:0      [点我收藏+]

标签:java   socket   字节   websocket   126   


之前用Java的Socket模拟HTTP传输实现了WebSocket的服务端,并成功与客户端握手

http://shuxiayeshou.blog.51cto.com/4452347/1762152


但是有个问题,就是从Server传输数据超过126字节就不行,连接自动断开还报错

InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
byte[] buff=new byte[3072];
int hasRead=0;
while((hasRead=in.read(buff)>0){
    byte[] pushHead=new byte[2];    //在传递数据前要传递这个数据头
    String x="要传输的数据......";
    pushHead[0]=buff[0];            //数据头数组的第一个字节是接收到的数据的第一个字节
    //第二个字节是要传输数据的字节数组长度转化成的字节
    pushHead[1]=(byte)x.getBytes("UTF-8").length;
    out.write(pushHead);            //先传递数据头
    out.write(x.getBytes("UTF-8");  //再传递数据
}

上面的代码在传递的数据转化成的字节数组长度小于126时是OK的,但是>=126时就报错。


因为字节的范围是-128~127,所以传输数据长度大于125就报错


那就要另外的处理方法

传输跟据数据长度分三种情况,即有三种范围

  1. 小于126,那么上面的代码就OK了

  2. 大于125 小于65536  那么数据头的第二个字节存的是(byte)126,第三第四个字节存的是数据长度

  3. 大于65535   数据头第二个字节存的是(byte)127,后面再有8个字节存数据长度


这样说过于平面,看代码吧(代码也是平面的好不 (╯°Д°)╯( ┻━┻    )


InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
byte[] buff=new byte[3072];
int hasRead=0;
while((hasRead=in.read(buff)>0){
    byte[] pushHead;    //在传递数据前要传递这个数据头
    String x="要传输的数据......";
    
    int length=x.getBytes("UTF-8").length;
    
    if(length<126){
        pushHead=new Byte[2];
        pushHead[0]=buff[0];    //数据头数组的第一个字节是接收到的数据的第一个字节
        //第二个字节是要传输数据的字节数组长度转化成的字节
        pushHead[1]=(byte)x.getBytes("UTF-8").length;
        out.write(pushHead);            //先传递数据头
    }
    else if(length>125 && length<65536){
        pushHead=new Byte[4];
        pushHead[0]=buff[0];
        pushHead[1]=(byte)126;
        pushHead[2]=(byte)((length>>8) & 0xFF);
        pushHead[3]=(byte)(length & 0xFF);
        out.write(pushHead);
    }
    else if(length>65535){
        pushHead=new Byte[4];
        pushHead[0]=buff[0];
        pushHead[1]=(byte)127;
        pushHead[2]=(byte)((length>>56) & 0xFF);
        pushHead[3]=(byte)((length>>48) & 0xFF);
        pushHead[4]=(byte)((length>>40) & 0xFF);
        pushHead[5]=(byte)((length>>32) & 0xFF);
        pushHead[6]=(byte)((length>>24) & 0xFF);
        pushHead[7]=(byte)((length>>16) & 0xFF);
        pushHead[8]=(byte)((length>>8) & 0xFF);
        pushHead[9]=(byte)(length & 0xFF);
        out.write(pushHead);
    }
    
    out.write(x.getBytes("UTF-8");  //再传递数据
}


这样大一些的数据也能一次传了,原先只能传不超过126字节数据时,要把数据分割分批传递,客户端接收后再组装或其它方式处理。不过目前只试了字符串的传输,还没试过图片,回头试试

本文出自 “树下野兽” 博客,请务必保留此出处http://shuxiayeshou.blog.51cto.com/4452347/1766112

WebSocket传输超过126字节数据的方法

标签:java   socket   字节   websocket   126   

原文地址:http://shuxiayeshou.blog.51cto.com/4452347/1766112

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!