InputStreamReaderでの文字列の受信
InputStreamReaderは、char文字(単一文字)単位でしかデータを受け取れません。
そのため、改行までを文字列として取得するのは、それなりに大変です。
今回は、文字列に変換する方法を示します。
それならBufferedReaderのreadLineメソッドで余裕じゃん!
といいたいところかもしれませんが、その理由については後ほど(笑)
文字列に変換するポイントは、StringBuilderを使うことです。
StringBuilder#appendによって、一文字づつ追加ができます。
コードを示します。
StringBuilder sb = new StringBuilder(); while ((data_tmp = in.read()) != '\n' && data_tmp != -1) { sb.append((char)data_tmp); } data_str = new String(sb); sb.setLength(0);
まずは、InputStreamReader#readによってchar文字を読み取ります。
それが改行コードや、終了コードでないならば、
StringBuilderに追加します。
全て追加が終わり、ループを抜けた後、String型に戻して完成です。
おそらくこの処理は、常時受信処理でしょうから、次の受信のためにStringBuilderを空にするのを
忘れないようにします。
ちなみに先ほど'改行コード'とイイましたが、
Windowsの場合は、改行コードは"\r\n"です。
この区別については、前々回のエントリーの
meriyasu-blog.hatenablog.com
に書いています。
参考になれば幸いです。
なんやかんやで簡単にInputStreamReaderの文字列化ができてしまいました。
先延ばしにした、なぜBufferedReaderを使わないのか、ですが、
BufferedReader br = new BufferedReader(new ObjectInputStream());
ということができず、InputStreamReaderならば、
InputStreamReader isr = new InputStreamReader(new ObjectInputStream());
ということができるからです!!
前回のエントリー、
meriyasu-blog.hatenablog.com
でも述べたように、今回、画像転送も必要としました。
しかし、もちろんBufferedReader, InputStreamReaderなどでは画像送信はできず、
ObjectInputStreamを使用する必要があります。
サーバークライアント通信において
一つのクライアントとサーバーを繋ぐソケットは基本的に一つです。
そのソケットのInputStreamも一つです。
そのため、ObjectInputStream用にsocketのInputStream,
BufferedReader用にsocketのInputStreamとするのはよくないです。
(closeするときなどに問題が起きるため)
よって、socketのInputStreamを一つにするため、
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); InputStreamReader in = new InputStreamReader(ois);
とできるInputStreamReaderを採用しました。
(そうしないと自分が実装できないだけで、できるのかもしれません())