从出站的Akka TCP流

时间:2018-03-23 08:55:18

标签: scala networking akka akka-stream

我正在处理一个相当挑剔的协议(SIP)的服务器,它需要我的本地IP和端口作为头结构的一部分。我使用的是Akka TCP流,因为它非常棒,但我错过了相当于BSD套接字getsockname的功能。在Akka面向actor的连接中,连接发送一个报告本地IP和端口的方便消息,但我找不到从Akka Streams版本获取此信息的方法。流直接连接到某个流以进行进一步处理,但是没有空间包含连接本地端的IP和端口的消息。

val connection = Tcp().outgoingConnection("www.google.com", 80)

val test = List("GET / HTTP/1.1", "Host: www.google.com", "\r\n").map(s ⇒ ByteString(s + "\r\n"))
val res = Source(test).via(connection).runFold(ByteString.empty)( _ ++ _ )

// How do I get the connection details here?
res.onComplete{
  case Success(resp) ⇒ println(resp.utf8String)
  case Failure(f) ⇒ println(f)
}    

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

以下是Tcp().outgoingConnection方法的签名:

def outgoingConnection(host: String, port: Int):
  Flow[ByteString, ByteString, Future[OutgoingConnection]]

具体化值为Future[OutgoingConnection]OutgoingConnection案例类的成员为localAddress

要访问传出连接的具体化值,然后访问本地地址,请使用以下内容:

val (res1, res2) =
  Source(test)
    .viaMat(connection)(Keep.right)
    .toMat(Sink.fold(ByteString.empty)(_ ++ _))(Keep.both)
    .run()

res1 onComplete {
  case Success(OutgoingConnection(_, localAddr)) =>
    println(s"local address: ${localAddr}")
  case Failure(f) =>
    println(f)
}