通过java套接字发送字节数组而不发送长度。

问题描述 投票:0回答:2

我有一个问题。我想通过socket发送一个字节数组,但我不想发送它的长度。我可以从服务器端读取吗?

我试过这样的方法。

dos = new DataOutputStream(socket.getOutputStream);
dos.write(myByteArray);

在服务器端...

byte data = new data[100];
dis.read(data);

但这样一来,我读取了100个字节或其他字节数。我可以准确地读取我发送的字节数吗? 谢谢。

java sockets server client bytearray
2个回答
0
投票

我可以准确地读取我发送的字节数吗?

如果你发送的是没有任何编码形式的任意字节,那么要么你需要发送一个长度(首先),要么你需要在写完最后一个字节后关闭套接字流。

如果你可以对字节进行编码,那么你需要发送长度(先)或者在写完最后一个字节后关闭套接字流。1或者如果你保证某些字节永远不会出现,那么客户端可以在数组的最后一个字节之后发送一个特殊的 "字节数组结束 "标记。

AFAIK,没有其他可靠的解决方案。2.


1 - 例如,编码可以简单地保留256个可能的字节值中的一个作为 "转义 "字节,当你想把它作为数据发送时,使用两个转义来表示该值。

2-考虑这个 "解决方案"。 写完字节后,客户端在发送任何更多的数据之前至少要等待N秒。如果服务器在N秒内没有看到任何字节,它将其解释为意味着进一步的数据不是第一个字节数组的一部分。 这样做是片面的,原因是如果出现拥堵或暂时的网络中断,数据流延迟了>N秒,它就会 样子 到服务器上,就像客户端已经完成了,而它还没有完成。


0
投票

迟来的回答,可能对其他人有帮助。

ArrayList<Byte> byteList = new ArrayList<>();
    do {
    byteList.add(inputStream.readByte());
    } while (inputStream.available()!=0);

这对我有帮助......不知道它是否是合法的方法或没有

之后将列表转换为字节数组

© www.soinside.com 2019 - 2024. All rights reserved.