4

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とかじゃなくて高等魔術ってこと?ここで私が知らなかった隠れた癖は何ですか?

編集: 修正: いくつかの試行と調査の後、実際には、プログラムはサーバー応答の最後の行のみを飲み込むことがわかりました。サーバー自体が完全な行を送信しない場合があるように思われるため、もちろんクライアントはそれらを読み取ります。

4

1 に答える 1

1

私は自分でそれを修正しました。満たされていない多くの仮定を行ったようです。

  private val receiver = actor {
    var done = false
    while (!done) {
      val n = in.read
      if(n < 0)
        done = true
      else
        handler(n.toChar)
    }
  }

今では問題なく動作しているようで、続行できます。

于 2012-11-12T12:53:35.073 に答える