Akka,发送Udp失败,“无法分配请求的地址”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Akka,发送Udp失败,“无法分配请求的地址”相关的知识,希望对你有一定的参考价值。
尝试Bind (and Send) as in the docs但它失败了:
[akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]成功绑定到[/127.0.0.1:64387] 发送消息:bla [akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]无法分配请求的地址 [akka:// udp-test / system / IO-UDP-FF / selectors / $ a / 0]停止后关闭DatagramChannel
如果目标地址是像62.138.0.158
这样的公共IP,或者像192.168.2.3
这样的本地网络,这两个都响应ping
,就会失败。
如果目标地址是任何端口上的127.0.0.1
(localhost),则成功。
将本地地址更改为本地网络中当前的IP后成功(例如:192.168.2.2
)
对于无效的ip,失败的方式不同
[akka:// default / system / IO-UDP-FF / selectors / $ a / 1]远程地址名称解析失败[invalid-ip:6969]
如果我完全像Simple Send in the docs那样成功,那就成功了。即,Bind
取代了SimpleSender
。但是我也需要在同一个端口收听,我希望它可以像Bind (and Send)的文档那样工作:
使用发送消息可以发送数据报
重现:
import java.net.InetSocketAddress
import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import akka.io.{IO, Udp}
import akka.io.Udp.Send
import akka.util.ByteString
object Main extends App {
val system = ActorSystem("udp-test")
val destAddr = new InetSocketAddress("62.138.0.158", 6969)
private val props = Props(classOf[Listener], destAddr)
val udp: ActorRef = system.actorOf(props, "udp-actor")
Thread.sleep(500) //give time for the actor to be created
udp ! "bla"
}
class Listener(remote: InetSocketAddress) extends Actor {
import context.system
IO(Udp) ! Udp.Bind(self, new InetSocketAddress("localhost", 0))
def receive = {
case Udp.Bound(local) =>
context.become(ready(sender()))
case other =>
println(s"Received something else: $other")
}
def ready(socket: ActorRef): Receive = {
case msg: String =>
println(s"Sending msg: $msg")
socket ! Send(ByteString(msg), remote)
case other =>
println(s"Received something else: $other")
}
}
我在运行macOS。
在将本地地址设置为0.0.0.0
后解决,意思是“listen on every available network interface”。
我有两个网络接口,每个接口都有一个IP地址:
127.0.0.1
在loopback接口上- 在本地网络中使用
192.168.x.x
,与路由器通信。
通过专门绑定到127.0.0.1
我不会得到来自外部的数据包,发送到我的192.168.x.x
IP。因此,倾听“所有人”是有道理的。
我的代码现在工作正常,但我仍然不明白发送时出现此错误的原因。
以上是关于Akka,发送Udp失败,“无法分配请求的地址”的主要内容,如果未能解决你的问题,请参考以下文章
无法在 localhost:8000 上侦听(原因:无法分配请求的地址)
Akka源码分析-Persistence-AtLeastOnceDelivery