问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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得到数个消息包
再按":"得到消息体得消息头
再按","解析具体内容
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
广东省考考哪3科 六个月宝宝缺铁吃什么好 疯狂动物园 大猩猩栖息地升级技巧 疯狂动物园怎么办boss任务 boss任务过法 疯狂动物园怎么驯服火山猩猩 疯狂动物园驯服火山猩猩 疯狂动物园火山猩猩 在陌生的城市如何辨别东南西北? 女羊男虎千万别在一起 女羊男虎婚配好不好 属羊女与属虎男婚姻能否长久 属羊女的和什么属相最配 NIO编程中的SelectionKey.interestOps方法中的逻辑运算是什么意思 一生好运富贵的女孩名字大全,好听的女孩名字大全 带有福气祥瑞的女网名,带有祥瑞的四字网名 一生好运富贵的女孩小名,表示一生好运富贵的女孩名字有哪些? 寓意富贵好运的女孩名字,女孩取什么名字好听又富贵 高贵带福气的名字,关于有福气都小名 一生好运富贵的女孩名字,象征着一生平安富贵的字女生 女孩大富大贵吉利的名字,好听高雅又聚财的女孩名字 非洲抽藤条是什么意思 藤条的意思百度作业帮帮忙 描写秋天的古诗还要把景象画出来 微信怎么查看自己的和密码 excel 比例的表示方式 如何隐藏QQ宠物的图标 不是关闭是隐藏 怎么把QQ名片卡的宠物一栏隐藏 我想买一台适合学java HTML等有关软件开发的笔记本电脑 笔记本出现html文件的默认应用设置出现问题,因此它已重置为microsoft edge 你能不能回在我身边为我打打气是什么意思? 〝给我们打打气〞是什么意思 求仓木麻衣的《review》的罗马拼音歌词! 在JAVA的NIO2服务器编程中,出现java.io.IOException: 指定的网络名不再可用后,如何恢复网络? 口快心直是何意·出自于哪? 笔记本怎样安装游戏手柄 游戏手柄怎么安到笔记本上? 如何安装游戏手柄?我买的一个U口上连着一对手柄,但没有驱动,安装不了,谁知道怎么安装,万能驱动不好使 养银凤鱼的注意事项,银凤鱼的饲养温度多高合适? 我买了金凤银凤三对和一条银龙鱼混养,可是这凤鱼老是咬银龙怎么办?还能继续混养吗 如图是甲状腺活动的调节示意图,请据图回答:(1)图中的“激素Ⅰ”和“激素Ⅱ”分别是______和______. 甲状腺激素的反馈调节示意图 下图是甲状腺活动的调节示意图。对该图的理解,不正确的是 [ ] A.图中X与Y分别 如图是人体甲状腺激素分泌的调节示意图 如图为甲状腺活动调节示意图,请据图回答(1)请用“+”(促进)或“-”(抑制)表示图中A.B.C.D四处 如图为人体内甲状腺激素分泌的调节过程 tsh负反馈调节图解 丙稀颜料调好后上冻了,解冻以后还能用吗? 丙烯颜料是不是第二天可以继续用 中国现在还计划生育吗 目前中国还实行计划生育吗? 快来钱贷款怎么样 贷款靠谱吗 紫色的半身裙配什么颜色的腰带