java nio编程怎么读取端户端传来的Object数据
发布网友
发布时间:2022-07-21 17:34
我来回答
共1个回答
热心网友
时间:2023-10-31 06:28
不要发Object 如果你的客户端包含手机 电脑 电视 WEB /WAP 。。。。
Object就不实用了。
收发的都是byte[] byte的内容是双方约好的数据结构
如:
客户端发送:
len+type+command+userid+":"+content+";"
例: 32 001 001 10001 : helloworld!;
其中32为len为整数 001为type为short,001为command为short,
10001为userid为八字节long, content为变长字符串。“;”和":"分别一字节。
type: 判断type可知道客户端的请求类型,如是聊天还是游戏
command: 判断command类型可知道客户端的请求具体命令,如聊天,表情等
所以,整个数据包头长度为: 4+2+2+8+1+content长+1
content的长度可以算出来;
byte[] stringBytes=content.getBytes();
len= StringBytes.length();
数据包的头*度为: int headLen=4+2+2+8+1;
数据包中数据体的长度为: int datalen= len+1;
整个数据包的长度为: headLen+datalen;
客户端发送时压成 :
byte[] toSend=new byte[headLen+datalen];
分别用System.arrayCopy命令将内容考入soSend中
copy datalen 到toSend的前两个字节
copy type 到toSend 占两个字节
copy command
copy userid
copy ":"
copy content.getBytes()
copy ";"
//行了, tosend中己经有压缩编码好的消息了
outputStream.write(toSend);//发送到服务端
outputStream.flash();//别忘了flash
////////////// 客户端发送完毕
服务端收取
byte[] datas=new byte[len];
inputStream.read(datas);
现在datas中己包含客户端发过来的byte[]
//////////// 下面开始解析
1。从 datas中拿两个字节出来得到len
2。再拿两个字节出来,得到 type
3。得到command
4。得到userid
5。拿一个字节 得到:或者;,如果没有:只有;证明客户端就发了个空消息
6。根据len的长度拿len个字节,得到String str=new String(指定长度拿来的byte[],指定编码);
7。 解析str,丢弃; 细分str的具体内容
//////////// 解析结束
另外一种办法,很偷懒,效率低一丁点:
全部用String 不用计算长度,最简单, 各数据项之间用","分割
String toString="len,type,command,userid: targetUserid,chatContent;"
这种形式最简单,效率会低点,但你初学可以直接用,以后再改进。
具体如下:
StringBuffer buffer =new StringBuffer();
buffer.append(len);
buffer.append(",");
buffer.append(type);
buffer.append(",");
buffer.append(command);
buffer.append(,);
buffer.append(userid);
buffer.append(":");
buffer.append(对方帐号);
buffer.append(",");
buffer.append(内容);
buffer.append(";");
String result=buffer.toString();
outputstream.write(result.getBytes("utf-8"));
flash()
///服务端收到以后,是纯字符串
先按";"split得到数个消息包
再按":"得到消息体得消息头
再按","解析具体内容