UnetStack3 模拟器 & 音频需要很长时间才能启动

UnetStack3 simulator & audio takes long time to start

运行 bin/unet simbin/unet audio 大约需要 5 秒才能打开浏览器 window。 机器:MBP、macOS Mojave (10.14.6)

打开 TCP 侦听端口似乎需要一些时间。日志如下:

1569411423819|INFO|org.arl.unet.UnetBoot@1:invoke|fjage Build: fjage-1.6.1/10-09-2019_00:41:43
1569411423833|INFO|org.arl.unet.UnetBoot@1:invoke|UnetBoot: [samples/2-node-network.groovy]
1569411423936|INFO|org.arl.unet.JsonTypeAdapter@1:<clinit>|Groovy detected, using GroovyClassLoader
1569411423956|INFO|org.arl.fjage.remote.MessageAdapterFactory@1:<clinit>|Groovy detected, using GroovyClassLoader
1569411424383|INFO|org.arl.unet.sim.SimulationMasterContainer@1:openTcpServer|Listening on port 1101
1569411424472|INFO|Script1@1:invoke|Starting web interface on port null:8081
1569411424554|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /fjage
1569411424555|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /
1569411424559|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /logs
1569411424559|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /sim
1569411434392|INFO|org.arl.fjage.connectors.TcpServer@12:run|Listening on port 1101
>> [Comment] Here it hangs
1569411439397|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /ws
1569411439440|INFO|org.arl.fjage.connectors.WebServer@1:start|Started web server on port 8081
1569411439443|INFO|org.arl.unet.sim.SimulationMasterContainer@1:addConnector|Listening on ws://172.23.155.178:8081/ws
1569411449455|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /fjage/shell/ws
1569411449728|INFO|Script1@1:invoke|Created static node A (arp) @ [0, 0, -15]
1569411449729|INFO|org.arl.unet.sim.SimulationMasterContainer@1:openTcpServer|Listening on port 1102
1569411449730|INFO|Script1@1:invoke|Starting web interface on port null:8082
1569411449731|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /fjage
1569411449732|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /
1569411449732|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /logs
1569411449732|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /sim
1569411459738|INFO|org.arl.fjage.connectors.TcpServer@26:run|Listening on port 1102
>> [Comment] Here it hangs
1569411464739|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /ws
1569411464742|INFO|org.arl.fjage.connectors.WebServer@1:start|Started web server on port 8082
1569411464742|INFO|org.arl.unet.sim.SimulationMasterContainer@1:addConnector|Listening on ws://172.23.155.178:8082/ws
1569411474754|INFO|org.arl.fjage.connectors.WebServer@1:add|Adding web context: /fjage/shell/ws
1569411474802|INFO|Script1@1:invoke|Created static node B (arp) @ [1000, 0, -15]
1569411474815|INFO|Script1@1:invoke| --- BEGIN SIMULATION #1 ---

似乎TCPServer class 是在你启动一个新的模拟节点时打开的(在日志中的这个地方)

1569411449729|INFO|org.arl.unet.sim.SimulationMasterContainer@1:openTcpServer|Listening on port 1102

似乎需要将近五秒钟才能开始。启动后,它会打印此日志

1569411459738|INFO|org.arl.fjage.connectors.TcpServer@26:run|Listening on port 1102

相关代码在这里https://github.com/org-arl/fjage/blob/master/src/main/java/org/arl/fjage/connectors/TcpServer.java#L71

看来 Java 的 InetAddress.getLocalHost().getHostAddress() 花了很长时间。

这似乎是 macOS 上的常见问题。参见

这个工具可以帮助您检查它是否确实是一个问题https://github.com/thoeni/inetTester

似乎 Java 在从 getHostName 返回之前尝试在 127.0.0.1 上进行 DNS 查找。根据您的 DNS 设置,这最多可能需要 5 秒才能超时。

根据上面链接的 Whosebug 文章,一个似乎有效的简单修复是为 127.0.0.1 添加一个别名到您的 /etc/hosts 文件。

这个 bash oneliner 可以为您做到这一点。

n=$(sudo scutil --get LocalHostName); sudo sed -i.bak "/127.0.0.1/s/$/ $n/" /etc/hosts; sudo sed -i.bak "/::1/s/$/ $n/" /etc/hosts