Connector
テキストのみで通信するサーバーとの間のテキストベースの IO を提供するクラスを作成しようとしています。つまり、基本的にはtelnet
クローンです。私はこれまでこれを書いてきました:
import java.net._
import scala.actors.Actor
import Actor._
import java.io._
class Connector(socket: Socket, handler: String => Unit) {
private val out = new PrintStream(socket.getOutputStream)
private val in = new BufferedReader(new InputStreamReader(socket.getInputStream))
private val receiver = actor {
var msg = in.readLine
while (msg != null) {
handler(msg)
msg = in.readLine
}
}
def print(msg: String) = out.println(msg)
def close = {
in.close
out.close
}
}
これでサーバーに接続しようとしました(テスト用)
import java.net._
import java.io._
import InetAddress.getByName
object Main extends App {
val addr = getByName("wolfwings.us")
val socket = new Socket(addr, 4000)
val connector = new Connector(socket, ((msg) => println(msg)))
val stdIn = new BufferedReader(new InputStreamReader(System.in))
var input = stdIn.readLine
while(input != null) {
connector.print(input)
input = stdIn.readLine
}
stdIn.close
connector.close
}
何が起こるか: 正しく接続され、サーバーのグリーティング画面が表示されます。そして、文章の途中で止まる。ここで入力すると、挨拶文の最後の行が出力され、次に残りから最後の行を引いたものが出力されます。等々。\n
また、すべての行の後ろに余分なものを置きます。に置き換えるprintln
と、突然 sprint
がなくなります。\n
私が見たところ、これはすべて正常かつ適切に機能するはずです。というか、こんな単純なテキストIOとかじゃなくて高等魔術ってこと?ここで私が知らなかった隠れた癖は何ですか?
編集: 修正: いくつかの試行と調査の後、実際には、プログラムはサーバー応答の最後の行のみを飲み込むことがわかりました。サーバー自体が完全な行を送信しない場合があるように思われるため、もちろんクライアントはそれらを読み取ります。