2017-02-22 4 views
1

私はアンドロイドアプリケーションでErlang-Libを使用してサーバーに接続しています。アンドロイド7より小さいアンドロイドデバイスを搭載したサーバーへの接続は正常に動作しています。今私はアンドロイド7.0とソニーZ5とHuaweiメイト9との接続をテストし、それはもはや働いていない。Android 7.0でnullの新しいソケットを作成すると動作しません。

我々はアーラン-Libのに見てみると、我々はクラスでこの呼び出しが表示されますOtpSocketTransport

あなたがここに見ることができるようInetAddressのは (文字列)ヌルに設定されている
/** 
* @see Socket#Socket(InetAddress, int) 
*/ 
public OtpSocketTransport(final InetAddress addr, final int port) 
     throws UnknownHostException, IOException { 
    socket = new Socket(addr, port); 
    socket.setTcpNoDelay(true); 
} 

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がnullで新しいソケットを作成するには、7より低いアンドロイドのデバイス用に

  • のですか?
  • なぜそれですかNOT OKアンドロイド7のデバイスでnullで新しいSocketを作成するには?
  • JavaからSocketクラスに変更がありましたか?

答えて

0

あなたのコードについてさらに詳しく説明しなくても、エラーはnullパラメータを持つ新しいソケット作成にはないと思います。

確かに私は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 

localhostと比較してxxx.comあなたの場合。

ホストマシンでEpmdが正しく動作していなかったときに起こったことです。 Epmdは現地で期待されているので、私の場合は問題の原因となっていました。

OtpNodeのインスタンスを作成する前に、EPMDは ホストマシン上で実行されていることを確認:確かに、(OtpNodeが定義されている)Jinterfaceのマニュアルは、次の明示的に述べています。

あなたはここで詳細を見つけることができます:http://erlang.org/doc/apps/jinterface/jinterface.pdfを章1.1.3ノードに。

関連する問題