我正在处理一个相当挑剔的协议(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)
}
有什么想法吗?
答案 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)
}