1

我有一个关于从服务器套接字读取字节的问题。我在网络上使用读写 8192b 字节的默认值。问题是有时您需要发送大于缓冲区容量的文件。为了避免增加缓冲区,因为您可以知道那些在不同时间到达的数据包是相关的?

客户端片段:

{
String c = xxxxx //imagine that it an string format JSON with 64000bites length
OutputStream wsOS = socket.getOutputStream();
wsOS.write(new String(data,"UTF-8"));
wsOS.flush();
}

当服务器端收到 JSON 字符串时:

{

 byte[] buffer = new byte[8192];
 int size = 0;

 StringBuilder str = new StringBuilder();

 size = wsIS.read(buffer);

if (size > 0) {

    str.append(new String(buffer, "UTF-8")
            .substring(0, size));

    while (wsIS.available() > 0) {
        size = wsIS.read(buffer);
        str.append(new String(buffer, "UTF-8")
                .substring(0, size));
    }

}
}

问题:

所有字符串都到达服务器但在块 8192b - 我无法连接字符串,因为我不知道最后一个字符串 JSON 是否是预览的一部分。

4

1 回答 1

2

即使您增加缓冲区大小,也不能保证在一次调用中读取整个字符串wsIS.read

这意味着您必须有某种机制来知道前一个字符串的结束位置和新字符串的开始位置。一些选择如下:

  1. 使用ObjectOutputStream/ObjectInputStream
  2. 在实际写入字符之前写入字符数。在阅读方面,阅读长度,然后阅读那些许多字符
于 2012-11-10T01:18:59.293 回答