繁体   English   中英

通过akka-stream读取TCP作为客户端

[英]reading TCP as client via akka-stream

我是akka-stream的新手,它试图将库用作客户端以从远程TCP服务器套接字读取(并且只能读取)。

但是,我的尝试失败,因为未处理任何传入的ByteString

既不是:

Source.empty[ByteString]
      .via(Tcp().outgoingConnection(address, port))
      .to(Sink.foreach(println(_))).run()

也不:

val connection = Tcp().outgoingConnection(address, port)
val sink = Flow[ByteString]
  .via(Framing.delimiter(
ByteString("\n"),
maximumFrameLength = 256,
allowTruncation = true))
  .map(_.utf8String)
  .to(Sink.foreach(println(_)))
connection.
  runWith(Source.empty, sink)

作品。

流无法运行的原因是什么? 所有提示非常感谢。

您需要一个未完成且不会生成任何数据的Source,例如Source.maybe。 请注意,它创建的Promise可以用于终止流程。

Source.maybe[ByteString]
.via(Tcp().outgoingConnection(host, port))
.to(Sink.foreach(println(_))).run()

就像@ViktorKlang提到的那样,客户端上空的Source导致了一个问题,即该流实际上不会运行。 您可以将管道设置为仅通过使用一个空的ByteString Source而不是一个空的ByteString Source来开始接收,如以下示例所示:

implicit val system = ActorSystem()
implicit val mater = ActorMaterializer()
val server = Tcp().bind("127.0.0.1", 2555)
server.runForeach{ conn =>
  Source.tick(1 second, 1 second, "foo")        
    .map(f => ByteString(f))
    .via(conn.flow)
    .to(Sink.ignore).run
}

val clientFlow = Tcp().outgoingConnection(new InetSocketAddress("127.0.0.1", 2555))
clientFlow.runWith(Source(List(ByteString.empty)), Sink.foreach(bs => println("client received: " + bs.utf8String)))

如果这样做,那么您将根据服务器端创建的滴答声源开始每秒从服务器接收数据。

它没有被运行,因为它永远不会处理任何数据:您有一个空流,因此它立即终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM