尝试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
等公共广告网络,或者是192.168.2.3
等本地网络,则两者都会响应ping
。
如果任何端口上的目标地址为127.0.0.1
(localhost),则成功。
成功(例如:192.168.2.2
)
不一样
[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.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。因此,倾听“所有人”是有道理的。
我的代码现在工作正常,但我仍然不明白发送时发生此错误的原因。