服务器套接字读取长字符串

时间:2012-11-10 01:09:44

标签: java sockets serversocket

我有一个关于从服务器套接字读取字节的问题。 我在网络上使用识字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是否是预览的一部分。

1 个答案:

答案 0 :(得分:2)

即使您增加缓冲区大小,也无法保证只需一次调用wsIS.read即可读取整个字符串。

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

  1. 使用ObjectOutputStream / ObjectInputStream
  2. 在实际写入字符之前写入字符数。在阅读方面,阅读长度,然后阅读那些很多字符