2014-12-15 13 views
10

Nie udało mi się uzyskać prostego przykładowego strumienia wirowania, czytania z TCP i pisania na standardowe wyjście.Jak czytać z TCP i pisać na standardowe wyjście?

val src = tcp.reads(1024) 
val addr = new InetSocketAddress(12345) 
val p = tcp.server(addr, concurrentRequests = 1) { 
    srC++ tcp.lift(io.stdOutLines) 
} 
p.run.run 

Po prostu tam siedzi, nie drukuje niczego.

Próbowałem również różne rozwiązania z wykorzystaniem to, zawsze z tcp.lift zaklęcia, aby uzyskać Process[Connection, A], w tym

tcp.server(addr, concurrentRequests = 1)(src) map (_ to tcp.lift(io.stdOutLines)) 

który nawet nie skompilować.

Czy muszę wye źródła i wydrukować strumieni razem? Przykład znaleziony na original pull request dla zastąpieniewydaje się to wskazywać, ale wye wydaje się już nie istnieć na Process, więc zamieszanie panuje niestety.


Edit okazuje się, że oprócz problemów typu wyjaśnione przez Pawła, trzeba także uruchomić wewnętrzne procesy „ręcznie”, na przykład wykonując p.map(_.run.run).run.run. Nie sądzę, że jest to idiomatyczny sposób, aby to zrobić, ale to działa.

Odpowiedz

5

Musisz przelać src przez zlew, aby cokolwiek napisać. Myślę, że powinno to zrobić:

import scalaz.stream.{io,tcp,text} 
import scalaz.stream.tcp.syntax._ 

val p = tcp.server(addr, concurrentRequests = 1) { 
    tcp.reads(1024).pipe(text.utf8Decode) through tcp.lift(io.stdOutLines) 
} 
p.run.run 

Wyrażenie srC++ tcp.lift(io.stdOutLines) powinno być naprawdę błędem typu. Typ tcp.reads(1024) to Process[Connection,ByteVector], a typ tcp.lift(io.stdOutLines) to Process[Connection, String => Task[Unit]]. Dołączanie tych dwóch procesów nie ma sensu, a jedyny powód, dla którego typechecks jest spowodowany kowariancją z Process[+F[_],+O]. Scala jest "pomocne" wnioskowanie Any po dołączeniu dwóch procesów z niepowiązanych typów wyjściowych.

przyszłych wersjach scalaz strumienia może dodać ograniczenia na ++ i innych funkcji, które wykorzystują kowariancji, aby upewnić się, że przynajmniej górna granica zostanie obliczony nie jest czymś bezużytecznym jak Any lub Serializable. W ten sposób można by zapobiec takim błędom. W międzyczasie upewnij się, że znasz typy wszystkich funkcji, z którymi współpracujesz, co robisz i jak je sklejasz.

+1

Korzystanie z narzędzia do usuwania brodawek sbt prawdopodobnie złapie to jako Dowolne wnioskowanie. –

+0

Masz na myśli 'przez io.stdOutLines', bez' tcp.lift'? Wciąż jednak nie wydaje się, by cokolwiek wyszło z potoku. –

+0

OK - z usuniętym 'tcp.lift', to działa, ale zauważ, że musisz' p.map (_. Run.run) .run.run', aby uruchomić wewnętrzne procesy. –

Powiązane problemy