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[]的时候自然没有办法还原了。

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

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

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

所以我怀疑会不会是网卡的设置问题?什么CHECKSUM之类的设置
老紫竹 2008-02-28
  • 打赏
  • 举报
回复
第一种最安全
你先判断读到的长度是否准确?
如果不准确,则发送方可能有问题
如果准确,逐个字节的分析吧。

62,629

社区成员

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

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