【问题标题】:how to read tcp stream using scala如何使用scala读取tcp流
【发布时间】:2019-05-01 18:40:08
【问题描述】:

我有一个在特定端口上生成 tcp 流的 java jar。

我可以运行 java -jar runner.jar 之类的 using java 命令,这开始在端口 8888 上生成消息流。

当我nc -l 8888 时,我可以看到消息。

我想使用 scala 和其他框架或工具(如 akka、akka-stream)来读取此流。

谁能帮助我了解最好的工具、框架或任何其他技术来读取这个 tcp 流。

我尝试使用带有以下代码的 akka 流:-

implicit val system = ActorSystem()
    implicit val mater = ActorMaterializer() val ss  = Tcp().outgoingConnection("127.0.0.1", 8888)
      .to(Sink.foreach(println(_)))
    Source.empty.to(ss).run()

我也试过了

Tcp().outgoingConnection(new InetSocketAddress("127.0.0.1", 8888))
        .runWith(Source.maybe[ByteString], Sink.foreach(bs => println(bs.utf8String)))

这不起作用。

我只需要自己阅读消息和处理。

谢谢

【问题讨论】:

标签: scala akka akka-stream


【解决方案1】:

据我了解,您想设置 TCP 服务器,这里是 TCP Echo using akka streams 的示例

def server(system: ActorSystem, address: String, port: Int): Unit = {
implicit val sys = system
import system.dispatcher
implicit val materializer = ActorMaterializer()

val handler = Sink.foreach[Tcp.IncomingConnection] { conn =>
  println("Client connected from: " + conn.remoteAddress)
  conn handleWith Flow[ByteString]
}

val connections = Tcp().bind(address, port)
val binding = connections.to(handler).run()

binding.onComplete {
  case Success(b) =>
    println("Server started, listening on: " + b.localAddress)
  case Failure(e) =>
    println(s"Server could not bind to $address:$port: ${e.getMessage}")
    system.terminate()
}

}

【讨论】:

  • OP 要求的是一个简单的客户端,而不是服务器。似乎 scala doc 不太关心客户。
猜你喜欢
  • 2015-02-05
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多