java - 通过套接字从服务器向 Android 客户端发送非常大的字符串

标签 java android sockets

我在通过套接字从服务器向 Android 客户端发送大字符串时遇到问题。

字符串大约 10MB。

向套接字写入数据的代码是这样的:

int socketTimeout = 200;
socket = new Socket(client.getHost(), client.getPort());
socket.setSoTimeout(socketTimeout);
OutputStreamWriter oos=new OutputStreamWriter(socket.getOutputStream());
String d = data.getData().toString() + "\n";
oos.write(d);

oos.flush();

从套接字读取数据的代码是这样的:

Socket s = params[0];
InputStream is = null;
try {
    is = s.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    int nRead;
    byte[] data = new byte[32768];

    while ((nRead = is.read(data, 0, data.length)) != -1) {
        baos.write(data, 0, nRead);
    }
    return new String(baos.toByteArray());
}

所以问题出现在我从 inputStream 读取内容的行,我得到了 OutOfMemoryException。我尝试使用从流中读取字符串的不同示例。我尝试使用 BufferedInputStream、InputStreamReader、IOUtils、StringBuilder、BufferedReader ..等。当字符串很大时,它们都会给我 OutOfMemory 异常。我用大约 100K 左右的较小数据进行了测试,效果非常好。

我在服务器端遇到的异常是“连接被对等方重置,套接字写入错误。”

最佳答案

您可以在客户端中逐字节读取并逐字节写入文件,这样您就不会在内存中保存整个字符串。

然后当然是按标记或行读取该文件,而不是一次读取整个字符串

关于java - 通过套接字从服务器向 Android 客户端发送非常大的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224249/

相关文章:

java - Java中生成多个列表的所有排列

android - 我应该在 Android 上使用 JavaCV 还是 OpenCV 的 java 库?

android - 哪个 API 用于访问 Android 应用程序的位置历史记录?

android - 无法运行 android/sdk/build-tools/23.0.2/aapt

asp.net - 我的物联网设备应该使用HTTP轮询还是使用TCP监听?

java - 获取电子邮件中附件的大小

java - "Dynamic"Java代码

java - 通过 Tcp 发送数据后,字符串比较不起作用

java - PowerScript "CHOOSE CASE"是否有 Java 等效项?

c++ - NS3 套接字混淆(需要帮助理解)