1

問題

ソケットサーバーからクライアントにメッセージ「12345」を送信します。

myPrintWriter.println("12345");

その後、クライアントで次のメッセージを読みました。

int c;
while ((c = inputStream.read( )) != -1)
{
    byte[] buffer2 = new byte[1];
    buffer2[0] = (byte) c;
    String symbol = new String(buffer2 , "UTF-8");
    String symbolCode = Integer.toString((int)buffer2[0]);
    Log.v(symbol, symbolCode);
}
Log.v("c == -1", "Disconnected");

ログに表示される内容: ここに画像の説明を入力

out.println("abcrefg");

ここに画像の説明を入力

なんで?回線終端記号だと思います。文字列「12345」またはその他の次の文字列を正しく取得する必要があります。お願い助けて。


bufferedReader.readLine() を使用する場合:

try 
{
    byte[] b1 = new byte[1];
    int dataInt = clientSocket.getInputStream().read();
    b1[0] = (byte)dataInt;

    final String data;
    if(dataInt == -1)
        connectionIsLost();

    if(dataInt != -1)
    {
        String c = new String(b1, "UTF-8");
        data = c + inToServer.readLine();
    }
    else
        data = inToServer.readLine();

    if (data != null)
    {
        Log.v("data", data);
        runOnUiThread(new Runnable()
        {
            //data parsing
        });
    }
} 
catch (IOException e){...}

メッセージの送信が遅い場合:

> V/data(5301): -3#Leo#alone in the dark 11-12
> V/message(5301): Leo: alone in the dark 11-12
> V/data(5301): -3#Leo#cgh 11-12 
> V/message(5301): Leo: cgh 11-12 
> V/data(5301): -3#Leo#c
> V/message(5301): Leo: c 11-12 
> V/data(5301): -3#Leo#x 11-12 
> V/message(5301): Leo: x
> V/data(5301): -3#Leo#d 11-12
> V/message(5301): Leo: d

しかし、私がそれをより速く行うと:

> V/data(5512): -3#Leo#fccc
> V/message(5512): Leo: fccc
> V/data(5512): -3#Leo#ccc
> V/data(5512): -3#Leo#cccc
> V/message(5512): Leo: ccc
> V/message(5512): Leo: cccc
> V/data(5512): --3#Leo#cccc //<-----error
> V/data(5512): 3-3#Leo#cccc //<-----error
> V/data(5512): #Leo#xdd

例外 :(

4

2 に答える 2

1

間違いなくCR/LFです。を使用しているのでありますprintlnprint代わりに試してください。

于 2012-11-13T10:57:56.637 に答える
1

UTF-8エンコンディングは 1 文字あたり 1 バイトを超える可能性があり、上記のコードはそれらを正しく処理できないことに注意してください。

Stringでエンコードされたものを読みたい場合UTF-8は、「BufferdReader」でデコードして行ごとに取得する方が良いでしょう。

コード例:

    String line;
    BufferedReader _in = new BufferedReader(new InputStreamReader(_socket.getInputStream(),"UTF-8"));

    try {
         while ((line = _in.readLine()) != null) {
            Log.d(TAG, line);
         }
         Log.d(TAG, "Connection is closed");
    } catch (Exception e) {
         Log.d(TAG, "Connection is closed");
    }

よろしく。

于 2012-11-13T13:56:50.000 に答える