在Android 7.0上创建带有null的新Socket无效

时间:2017-02-22 12:32:51

标签: android-7.0-nougat tcpsocket

我在我的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());
}

我的问题是:

  • 为什么 OK 对于android低于7的设备来创建一个带有null的新Socket?
  • 为什么不行对于使用android 7的设备创建一个带有null的新Socket?
  • 来自java的Socket类是否有变化?

1 个答案:

答案 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