正在尝试 Bind (and Send) as in the docs但它失败了:
[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Successfully bound to [/127.0.0.1:64387]
Sending msg: bla
[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Can't assign requested address
[akka://udp-test/system/IO-UDP-FF/selectors/$a/0] Closing DatagramChannel after being stopped
如上失败如果目标地址是公共(public) IP,例如
62.138.0.158
或在本地网络中,如 192.168.2.3
, 两者都响应 ping
.成功 如果目标地址是
127.0.0.1
(本地主机)在任何端口上。成功 在本地网络中将本地地址更改为我当前的 ip 后(例如:
192.168.2.2
)失败不同对于无效的 ip
[akka://default/system/IO-UDP-FF/selectors/$a/1] Name resolution failed for remote address [invalid-ip:6969]
成功 如果我完全按照 Simple Send in the docs反而。即,使用
Bind
替换为 SimpleSender
.但我还需要在同一个端口上监听,我希望它可以作为 Bind (and Send) 的文档工作。说:Sending datagrams is achieved by using the Send message
复制:
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”。
我有两个网络接口(interface),每个都有一个 IP 地址:
127.0.0.1
环回接口(interface)192.168.x.x
在本地网络中,与路由器通话。 通过专门绑定(bind)到
127.0.0.1
我不会收到来自外部的数据包,地址是我的 192.168.x.x
知识产权。所以听“所有这些”是有道理的。我的代码现在可以正常工作,但我仍然不明白为什么在发送时会发生此错误。
关于macos - Akka,发送 Udp 失败, "Can' t 分配请求的地址”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47381045/