通过套接字 java 发送字节数组而不发送长度
Sending byte array through socket java without sending length
我有一个问题。我想通过套接字发送一个字节数组,但我不想发送它的长度。我可以从服务器端读取它吗?
我试过这样的事情:
dos = new DataOutputStream(socket.getOutputStream);
dos.write(myByteArray);
在服务器端
byte data = new data[100];
dis.read(data);
但通过这种方式,我读取了 100 个字节或另一个字节数。我能读清楚吗?我发送的字节数?
谢谢
Can I read exacty the no. of bytes I send?
如果您发送任意字节而没有任何形式的编码,那么您要么需要发送一个长度(首先),要么您需要在写入最后一个字节后关闭套接字流。
如果你可以对字节1进行编码,或者如果你保证某些字节永远不会出现,那么客户端可以在最后一个之后发送一个特殊的"end-of-byte-array"标记数组的字节。
据我所知,没有其他可靠的解决方案2。
1 - 例如,编码可以很简单,只需将 256 个可能的字节值之一保留为 "escape" 字节,并在需要时使用两次转义来表示该值将其作为数据发送。
2 - 考虑这个 "solution"。写入字节后,客户端在发送任何更多数据之前至少等待 N 秒。如果服务器在 N 秒内没有看到任何字节,它会将这解释为意味着进一步的数据不是第一个字节数组的一部分。这是不稳定的原因是,如果出现拥塞或临时网络中断,并且数据流延迟 > N 秒,它将 向服务器查看 就像客户端已完成一样, 当它没有时。
迟到的回复,可能对其他人有帮助..
ArrayList<Byte> byteList = new ArrayList<>();
do {
byteList.add(inputStream.readByte());
} while (inputStream.available()!=0);
这对我有帮助..不知道这是否是合法的方法
在此之后将列表转换为字节数组
我有一个问题。我想通过套接字发送一个字节数组,但我不想发送它的长度。我可以从服务器端读取它吗?
我试过这样的事情:
dos = new DataOutputStream(socket.getOutputStream);
dos.write(myByteArray);
在服务器端
byte data = new data[100];
dis.read(data);
但通过这种方式,我读取了 100 个字节或另一个字节数。我能读清楚吗?我发送的字节数? 谢谢
Can I read exacty the no. of bytes I send?
如果您发送任意字节而没有任何形式的编码,那么您要么需要发送一个长度(首先),要么您需要在写入最后一个字节后关闭套接字流。
如果你可以对字节1进行编码,或者如果你保证某些字节永远不会出现,那么客户端可以在最后一个之后发送一个特殊的"end-of-byte-array"标记数组的字节。
据我所知,没有其他可靠的解决方案2。
1 - 例如,编码可以很简单,只需将 256 个可能的字节值之一保留为 "escape" 字节,并在需要时使用两次转义来表示该值将其作为数据发送。
2 - 考虑这个 "solution"。写入字节后,客户端在发送任何更多数据之前至少等待 N 秒。如果服务器在 N 秒内没有看到任何字节,它会将这解释为意味着进一步的数据不是第一个字节数组的一部分。这是不稳定的原因是,如果出现拥塞或临时网络中断,并且数据流延迟 > N 秒,它将 向服务器查看 就像客户端已完成一样, 当它没有时。
迟到的回复,可能对其他人有帮助..
ArrayList<Byte> byteList = new ArrayList<>();
do {
byteList.add(inputStream.readByte());
} while (inputStream.available()!=0);
这对我有帮助..不知道这是否是合法的方法
在此之后将列表转换为字节数组