WebSocket传输超过126字节数据的方法
2016-04-21 10:26
796 查看
之前用Java的Socket模拟HTTP传输实现了WebSocket的服务端,并成功与客户端握手
http://shuxiayeshou.blog.51cto.com/4452347/1762152
服务端和客户端握手成功后就可以开始交互了。客户端发来个信息,服务端接收,再反回个信息。
服务端向客户端发数据用byte[]型,且UTF-8编码,比如字符串就是 str.getBytes("UTF-8");
但是有个要求,在发送数据之前要发一个头数据。这个头数据当然也是byte[]型数组。
头数据包含啥呢?
比如这个头数据我们定义
长度为2的byte数组。第一个元素pushHead[0]存的是接收到来自客户端byte[]的第一个元素
比如客户端传来的数据我们用一个
那么
而头数据的第二个元素pushHead[1]存的是服务端要发给客户端数据的长度
但是有个问题,就是从Server传输数据超过126字节就不行,连接自动断开还报错
因为字节的范围是-128~127,所以传输数据长度大于125就报错
那就要另外的处理方法
传输跟据数据长度分三种情况,即有三种范围
小于126,那么上面的代码就OK了
大于125 小于65536 那么数据头的第二个字节存的是(byte)126,第三第四个字节存的是数据长度
大于65535 数据头第二个字节存的是(byte)127,后面再有8个字节存数据长度
这样说过于平面,看代码吧(代码也是平面的好不 (╯°Д°)╯( ┻━┻ )
这样大一些的数据也能一次传了,原先只能传不超过126字节数据时,要把数据分割分批传递,客户端接收后再组装或其它方式处理。不过目前只试了字符串的传输,还没试过图片,回头试试
http://shuxiayeshou.blog.51cto.com/4452347/1762152
服务端和客户端握手成功后就可以开始交互了。客户端发来个信息,服务端接收,再反回个信息。
服务端向客户端发数据用byte[]型,且UTF-8编码,比如字符串就是 str.getBytes("UTF-8");
但是有个要求,在发送数据之前要发一个头数据。这个头数据当然也是byte[]型数组。
头数据包含啥呢?
比如这个头数据我们定义
byte[] pushHead=new byte[2];
长度为2的byte数组。第一个元素pushHead[0]存的是接收到来自客户端byte[]的第一个元素
比如客户端传来的数据我们用一个
byte[] buff=new byte[3072]; socket.getInputStream.read(buff);
那么
pushHead[0]=buff[0];
而头数据的第二个元素pushHead[1]存的是服务端要发给客户端数据的长度
但是有个问题,就是从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就报错
那就要另外的处理方法
传输跟据数据长度分三种情况,即有三种范围
小于126,那么上面的代码就OK了
大于125 小于65536 那么数据头的第二个字节存的是(byte)126,第三第四个字节存的是数据长度
大于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[10]; 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字节数据时,要把数据分割分批传递,客户端接收后再组装或其它方式处理。不过目前只试了字符串的传输,还没试过图片,回头试试
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序