2

問題

接続を確認するために、ソケット クライアントの最初のバイトを読み取ります。

ByteBuffer b = ByteBuffer.allocate(4);
b.order(ByteOrder.BIG_ENDIAN);
...
int dataInt = clientSocket.getInputStream().read();

ドキュメンテーション:

このストリームから 1 バイトを読み取り、0 ~ 255 の範囲の整数として返します。ストリームの末尾に到達した場合は -1 を返します。

その後、このバイトを次の入力文字列にスプライスしたいと思います。この整数バイトを文字に変換します

b.putInt(dataInt);
byte[] dataByte = b.array();
final String data;

確認してください。dataInt != -1 の場合、このトリミングされたバイトを新しい文字列に戻す必要があります。

if(dataInt != -1)
{
    String c = new String(dataByte);
    Log.v("MSG", c);
    data = c + inToServer.readLine();
}
else
{
    data = inToServer.readLine();
}

ログに "MSG, ������MY MESSAGE" と表示されるのはなぜですか? 文字列を正しく取得するには?


Upd、メッセージの送信方法:

byte[] buf = str.getBytes("UTF-8");
outToServer.write(buf, 0, buf.length);
outToServer.writeBytes("\n");
outToServer.flush();
4

4 に答える 4

2
if(dataInt != -1)
{
    String c = new String(dataByte, "UTF-8");
    Log.v("MSG", c);
    data = c + inToServer.readLine();
}
else
{
    data = inToServer.readLine();
}
于 2012-11-11T20:40:33.323 に答える
1

さて、サーバー側では、受信した byte[] を使ってこれを行うだけです。バイト バッファーは必要なく、何らかの方法で操作する必要もありません。

String str = new String(recievedBytes); 
于 2012-11-11T20:40:55.240 に答える
0

これにはIOUtils.toStringを使用することをお勧めします。退屈でエラーが発生しやすい入出力ストリーム操作の多くを容易にします。

これは、 Apache IO commons を使用するようにプロジェクトをセットアップする方法を説明する回答です。

于 2012-11-11T20:48:59.067 に答える
0

ああ、やった。解決:

byte[] b1 = new byte[1];
int dataInt = clientSocket.getInputStream().read();
b1[0] = (byte)dataInt;
于 2012-11-11T21:16:58.613 に答える