2015-01-17 3 views
1

Я пишу старый telnet-сервер, основанный на школьном тексте, который сейчас является прославленным чатом в Скала с актером, основанным на Акке. То, что происходит, это тот клиент, который клиент начнет вводить что-то, а затем произойдет событие, и когда оно будет написано, оно уничтожит все, что уже было напечатано. В следующем примере Том начал набирать «say How are you?» но Фред приходит после того, как он только набирается «говорят как ар» и этот вход вытерт:Можете ли вы обновить или повторно отобразить несвязанный вход telnet?

Tom > say How ar 
Fred has arrived. 
Tom > 

Есть ли способ, чтобы получить телнет для повторного его выходного буфера он еще не покраснел?

Вот сервер:

class TcpServer(port: Int) extends Actor { 
    import TcpServer._ 
    import context.system 

    val log = Logging(system, this) 
    var connectionNum: Int = 1 

    log.info(STARTING_SERVER) 

    IO(Tcp) ! Bind(self, new InetSocketAddress("0.0.0.0", port)) 

    def receive = { 
    case b @ Bound(localAddress) => 
     log.info(PORT_BOUND, localAddress) 
    case c @ Connected(remote, local) => 
     log.info(CONNECTION_ACCEPTED) 
     context.actorOf(ConnectionHandler.connectionProps(sender()), s"conn$connectionNum") 
     connectionNum += 1 
    case CommandFailed(_: Bind) => 
     log.error(BINDING_FAILED) 
     context stop self 
    } 
} 

Вот ConnectionHandler, это объект компаньон, и сообщение тематические классы он использует:

class ConnectionHandler(connection: ActorRef) extends Actor { 
    import context._ 

    val log = Logging(context.system, this) 

    connection ! Register(self) 

    var delegate = actorOf(Props[LoginHandler], "login") 
    watch(delegate) 

    def receive = { 
    case Received(data) => 
     val dataString = data.utf8String.trim 
     log.info("Received data from connection: {}", dataString) 
     delegate ! Input(dataString) 

    case Output(content) => 
     connection ! Write(ByteString(content)) 

    case LoggedIn(user) => 
     unwatch(delegate) 
     delegate ! PoisonPill 

     delegate = actorOf(UserHandler.connectionProps(user), user.name.toLowerCase) 
     watch(delegate) 

    case Terminated => 
     log.warning("User delegate died unexpectedly.") 
     connection ! ConfirmedClose 

    case CloseConnection(message) => 
     connection ! Write(ByteString(message + "\n")) 
     connection ! ConfirmedClose 
     log.info("User quit.") 

    case ConfirmedClosed => 
     log.info("Connection closed.") 
     stop(self) 

    case PeerClosed => 
     log.info("Connection closed by client.") 
     stop(self) 
    } 
} 

object ConnectionHandler { 
    def connectionProps(connection: ActorRef): Props = Props(new ConnectionHandler(connection)) 
} 

case class Input(input: String) 
case class Output(output: String) 
case class LoggedIn(user: User) 
case class CloseConnection(message: String) 

ответ

0

Хорошо, после того, как, наконец, формулируя свои запросы Google правильно, Я нашел то, что мне было нужно здесь: Force telnet client into character mode

Основным решением является то, что я заставил клиента обозначить символ t - режим времени и echo'd назад персонажей, которые меня волнуют. Бонус к этому заключается в том, что теперь я могу выполнить табуляцию, историю команд и сделать пароли не отображаемыми.

Вот соответствующий фрагмент кода:

val controlString = ByteString('\u00ff','\u00fb','\u0001','\u00ff','\u00fb','\u0003','\u00ff','\u00fc','\u0022') 

connection ! Write(controlString) 
Смежные вопросы