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

のjavadocを見ると、writeUTF()このメソッドが処理できるのは最大65535バイトの文字列のみであることが明らかです。(エンコードされた形式は、文字列のバイト数を示す2バイトで始まります)。

あなたの選択は次のとおりです。

  • String.toCharArray()、を使用して抽出された文字の配列として文字列を送信します
  • String.getBytes( "UTF-8")を使用してUTF8-文字列を明示的にエンコードし、結果のバイトを送信するか、または
  • それをより小さな部分文字列に分割し、writeUTF8を使用してそれらを送信し、もう一方の端でそれらをつなぎ合わせます。

これらはすべて、実際のデータの前にカウントを付けて、もう一方の端にどれだけ期待/読み取りを行うかを指示する必要があります。

Writerもう1つの方法は、 andReaderの代わりにDataOutputStreamaを使用して、データをテキストとして送受信すること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 に答える