2015-02-07 3 views
1

я пишу эхо-приложение, которое send и receive'\0' завершённая строкаscalaz потока TCP `echo` приложение не работает

https://gist.github.com/jilen/10a664cd588af10b7d09

object Foo { 

    implicit val S = scalaz.concurrent.Strategy.DefaultStrategy 
    implicit val AG = tcp.DefaultAsynchronousChannelGroup 
    ... 

    def runServer() { 
    def writeStr(str: String) = tcp.write(ByteVector(str.getBytes)) 
    val echoServer = (readStr |> serverLog("[Server] Receiving")).flatMap(writeStr) 
    val server = tcp.server(addr, concurrentRequests = 1)(echoServer.repeat) 
    server.flatMap(_.drain).run.run 
    } 

    def runClient() { 
    val topic = async.topic[String]() 
    val echoClient = (topic.subscribe |> clientLog("[Client] Inputing")).map { str => 
     tcp.write(ByteVector(str.getBytes) ++ Delimiter) ++ (readStr |> clientLog("[Client] Receiving")) 
    } 
    val client = tcp.connect(addr)(tcp.lift(echoClient)) 
    client.run.runAsync(println) 
    io.stdInLines.to(topic.publish).run.run 
    } 
} 

Foo.runServer() Я бегу и Foo.runClient() на другом терминале

И введите номера 1 2 3 ... с клиентской консоли, но клиент не получит ответа.

enter image description here enter image description here

Что случилось с моим эхо-приложение?

+0

что тип сервера? его 'Процесс [Задача, Процесс [Задача, Throwable \/A]]]' правильно? Итак, 'server.run.run' - это' Process [Task, Throwable \/A] ', который вы выбрасываете, не так ли? – stew

+0

@stew Как запустить сервер? – jilen

+0

Я прав о типах? если да, тогда вам кажется, что вы должны запускать этот процесс, а не бросать его. – stew

ответ

0

Наконец я переписать клиента как

val echoClient = tcp.subscribe.map(str => ByteVector(str.getBytes) ++ Delimiter) 

val client = tcp.connect(addr)(tcp.writes(echoClient)) 

И это работает

Смежные вопросы