2017-02-22 83 views
1

我在我的android應用程序中使用Erlang-Lib來連接到服務器。連接到Android設備小於android 7的服務器的連接工作正常。現在我已經用android 7.0測試了與Sony Z5和Huawei Mate 9的連接,並且它不再工作。在Android 7.0上創建新的Socket with null不起作用

如果我們看看到二郎-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是否是設置爲(字符串)空,你可以在這裏看到: in line 286(類OtpEpmd,方法:r4_publish)

s = node.createTransport((String) null, EpmdPort.get()); 

在這裏,您可以看到設備在Android logcat的輸出與Android 7.0: (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的設備來創建空新的Socket?
  • 爲什麼它是不行設備與android 7創建一個新的Socket與null?
  • 從java中的Socket類有變化嗎?

回答

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在你的情況。

Epmd在相同的主機上運行不正常。由於Epmd預計在本地,因此這是本案中問題的根源。事實上,Jinterface的文件(其中OtpNode定義)明確規定以下內容:

之前創建OtpNode的實例,確保EPMD上 主機運行。在章1.1.3節點http://erlang.org/doc/apps/jinterface/jinterface.pdf

您可以在這裏找到的細節。