[Java] DataOutputStreamクラスの仕様がおかしい.
Socket通信の際のデータをやりとりには,
出力 : DataOutputStreamクラス
入力 : InputStreamクラス
を使います.
入力に関しては,
InputStreamクラスを基に,
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
みたいにして使えばいいです.
出力に関しては,
DataOutputStreamクラスを直接使うのですが,
このクラスの書き込みメソッドがいくつかあって,
writeByte(Byte byte)
writeBytes(String string)
...
などがあるのですが、
普通にStringを送る事しか考えなかった場合,
writeBytes(String string)に飛びつく訳です.
しかし,この関数のドキュメントをよく読むと
文字列を基本となる出力ストリームに一連のバイトとして書き込みます。文字列中の各文字型データは順番に書き込まれ、このとき上位 8 ビットは無視されます。
大事なのは最後です.
このとき上位 8 ビットは無視されます。
謎です..
日本人の敵としか思えない.
なので,
日本語を送るときは,
writeBytes(String string)
ではなく,
Byte[] bytes = string.getBytes(); for (int i=0;i<bytes.length;i++){ writeByte(bytes[i]); }
を使わないと文字化けしてしまいます.