我在我的Android应用程序中使用Erlang-Lib连接到服务器。与Android设备小于android 7的服务器连接工作正常。现在我已经测试了与索尼Z5和华为Mate 9与Android 7.0的连接,它不再工作了。
如果我们查看Erlang-Lib,我们将在类OtpSocketTransport 中看到此调用:
/**
* @see Socket#Socket(InetAddress, int)
*/
public OtpSocketTransport(final InetAddress addr, final int port)
throws UnknownHostException, IOException {
socket = new Socket(addr, port);
socket.setTcpNoDelay(true);
}
InetAddress设置为(String)null ,如下所示: in line 286。 (类OtpEpmd,方法:r4_publish)
s = node.createTransport((String) null, EpmdPort.get());
在这里,您可以看到Android 7.0设备的Android LogCat输出: (xxx被我改变了)
02-22 13:00:40.518 31544-31886/com.xxx W/System.err: java.io.IOException: Nameserver not responding on xxx.com when publishing xxx
02-22 13:00:40.518 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpEpmd.r4_publish(OtpEpmd.java:350)
02-22 13:00:40.518 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpEpmd.publishPort(OtpEpmd.java:145)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpNode$Acceptor.publishPort(OtpNode.java:784)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpNode$Acceptor.<init>(OtpNode.java:776)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpNode.init(OtpNode.java:232)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpNode.<init>(OtpNode.java:196)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.ericsson.otp.erlang.OtpNode.<init>(OtpNode.java:149)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.xxx.Manager.ErlifGen.<init>(ErlifGen.java:27)
02-22 13:00:40.519 31544-31886/com.xxx W/System.err: at com.xxx.Manager.Manager$ActivateThread.run(Manager.java:518)
我可以调整OtpEpmd类中的代码,然后它正在工作:
if (Build.VERSION.SDK_INT < 24) { //24 is Android 7 Nougat
s = node.createTransport((String)null, EpmdPort.get());
} else {
s = node.createTransport(InetAddress.getByName("localhost"), EpmdPort.get());
}
我的问题是:
答案 0 :(得分:0)
即使没有关于代码的更多细节,我相信错误不在使用null参数的新Socket创建中。
事实上,我已经能够使用OtpNode类运行一些类似的代码,但没有需要将你提出的改编运行到OtpEpmd类中。此代码在Android 5.1,6.0,7.0,7.1和8.0上正常运行。您可以在这里查看这样的代码示例:
https://github.com/JeromeDeBretagne/erlanglauncher
我遇到了类似的错误消息:
java.io.IOException: Nameserver not responding on localhost when publishing xxx
略有不同,因为在您的情况下,与 xxx.com 相比,名称服务器在 localhost 上没有响应。
当Epmd在相同主机上运行不正常时,发生了这种情况。由于Epmd是在本地预期的,因此在我的案例中它是问题的根源。实际上,Jinterface(其中定义了OtpNode)的文档明确说明了以下内容:
在创建OtpNode实例之前,请确保Epmd正在运行 主机。
您可以在 1.1.3节点一章中找到详细信息:http://erlang.org/doc/apps/jinterface/jinterface.pdf。