0

我有一个通过 TCP 套接字与我编写的服务器通信的 Android 应用程序。我现在用来读取和写入输出的方法适用于较小的字符串(最大 60kB),但是当字符串长得多时会抛出异常。这是我为服务器和客户端所拥有的相关部分:

服务器:

            DataInputStream dis = null;
            DataOutputStream dos = null;

            try {
                    dis = new DataInputStream(server.getInputStream());
                    dos = new DataOutputStream(server.getOutputStream());

                    String input = "";
                    input = dis.readUTF();
                    handle_input info = new handle_input(input, id);
                    String xml = info.handle();

                    dos.writeUTF(xml);

                    server.close();

            } 

客户:

        Socket socket = null; 
        DataOutputStream dos = null;
        DataInputStream dis = null;
        Boolean result;

        try {
            socket = new Socket(ip, port);
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new DataInputStream(socket.getInputStream());
            dos.writeUTF(the_text);
            String in = "";
            while (in.equals("")) {
                in += dis.readUTF();
            }
        }

如何修改它以处理潜在的巨大字符串?我一直在环顾四周,似乎无法找到明确的答案。

谢谢。

4

2 回答 2

6

如果查看 的javadocwriteUTF()很明显该方法只能处理最多 65535 个编​​码字节的字符串。(编码形式以 2 个字节开始,给出字符串字节数)。

您的选择是:

  • 将字符串作为使用提取的字符数组发送String.toCharArray()
  • 使用 String.getBytes("UTF-8") 对字符串进行 UTF8 显式编码并发送结果字节,或者
  • 将其拆分为较小的子字符串,使用 writeUTF8 发送它们,然后在另一端将它们拼接在一起。

所有这些都需要在实际数据之前加上一个计数,以告诉另一端期望/读取多少。

另一种方法是使用 a WriterandReader代替DataOutputStreamand以文本形式发送/接收数据DataInputStream

于 2012-11-10T04:47:06.977 回答
-1

使用以下命令发送数据:

Socket s = new Socket();
s.connect(new InetSocketAddress("IP_addr_,Port_no));

OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os);

pw.println("String");
于 2012-11-10T04:57:33.747 回答