JAVA通过SOCKET接收二进制数据的困惑(用了三种方法都有不同问题),请教各位大虾

jack286 2008-02-28 05:35:29
java socket作为serversocket接收客户端发来的数据,组成方式比如为“6个字节的字符串+16个字节字符串+16位二进制的MD5码+|END|\0"。

下面折磨我很久的问题出现了:
方案一:
byte[] tb=new byte[1000];
socket s;
int readLength = s.getInputStream().read(buffer, offset, maxLength);
received = new String(buffer);
System.out.println("received="+received);
读取数据流,打印出来前面的没问题,却没有|END|.

方案二:
byte[] tb=new byte[1000];
socket s;
s.getInputStream().read(tb);
String received=new String(tb);
System.out.println("received="+received);
打印出来是|END|+16个字节的字符串+16位MD5码,却没有开头的6位长的字符串了

方案三:
BufferedReader buffer= new BufferedReader(new InputStreamReader(s.getInputStream()));

received = buffer.readLine();
System.out.println("received="+received);
这个打印出来到是没有问题,但是我却无法把buffer变量转换位byte[]数组,因此无法完成把MD5码取出来验证的任务。
也许有人会说先用received.getBytes()来把字符串转换为byte[],但是这样的话,我试过,二进制的MD5码根本就不能还原为客户端发送的最初值,原因应该是用buffer.readLine()转换成字符串的时候,二进制转成ASCII码有了乱码,然后再转成byte[]的时候自然没有办法还原了。

苦苦求索,而不得,望各位不吝指教
...全文
1254 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack286 2008-03-04
  • 打赏
  • 举报
回复
有没有具体点的分析啊?

第一种,长度绝对是准确的,我就算加长到1000都还是一样,实际只有106.关键是为什么读不到|END|啊?

而且第二种方式,|END|怎么会跑到最前面去?可能是重复了|END|把前面的6位字符给覆盖了,但是为什么会有这种情况呢?网络状况是很好的啊?

所以我怀疑会不会是网卡的设置问题?什么CHECKSUM之类的设置
老紫竹 2008-02-28
  • 打赏
  • 举报
回复
第一种最安全
你先判断读到的长度是否准确?
如果不准确,则发送方可能有问题
如果准确,逐个字节的分析吧。
内容概要:本文介绍了一个基于MATLAB R2025b平台的无人机三维路径规划项目,提出将长短期记忆网络(LSTM)与快速扩展随机树(RRT)相结合的LSTM-RRT混合算法。通过构建三维体素环境模型,利用LSTM学习历史路径序列和局部环境特征,预测采样方向以引导RRT的搜索过程,从而提升路径规划的效率、路径质量和对复杂环境的适应能力。文中详细阐述了三维环境建模、LSTM网络结构设计、RRT采样机制以及两者融合策略,并提供了关键模块的MATLAB代码示例,包括环境构建、网络训练、融合采样、路径回溯与三维可视化等。; 适合人群:具备一定MATLAB编程基础和机器学习基础知识,从事无人机导航、路径规划、智能控制等相关领域的科研人员及工程技术人员。; 使用场景及目标:①在城市楼宇、山地等复杂三维环境中为无人机规划安全、高效、平滑的飞行路径;②研究深度学习与传统采样算法的融合机制,提升RRT类算法的智能性与实用性;③作为智能路径规划的教学案例或工程原型,支持算法快速验证与二次开发。; 阅读建议:此资源侧重于算法原理与工程实现的结合,建议读者结合提供的代码示例,深入理解LSTM与RRT的交互逻辑,并在MATLAB环境中动手调试与运行,以掌握其在三维空间中的动态规划过程与可视化效果。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧