2017-02-22 1 views
1

내 안드로이드 응용 프로그램에 Erlang-Lib을 사용하여 서버에 연결하고 있습니다. 안드로이드 장치가 안드로이드 7보다 작은 서버에 연결하면 정상적으로 작동합니다. 이제 소니 Z5와 화웨이 메이트 9와 안드로이드 7.0과의 연결을 테스트했으며 더 이상 작동하지 않습니다.Android 7.0에서 null로 새 소켓 만들기가 작동하지 않습니다.

우리가 얼랑-lib 디렉토리로보고있는 경우 우리가 클래스에서이 호출을 볼 수 OtpSocketTransport :

당신이 여기에서 볼 수 있듯이의 InetAddress가 (문자열) 널 (null)로 설정
/** 
* @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()); 
여기

당신이 안드로이드 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가 null로 새로운 소켓을 만들 수있는 7보다 안드로이드와 장치에 대한

  • 입니까?
  • 이유가 무엇입니까 안드로이드가있는 장치의 경우은 null로 새 소켓을 만들 수 있습니까?
  • 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 

로컬 호스트에 비해 xxx.com에 비교하십시오.

호스트 컴퓨터에서 Epmd가 제대로 실행되지 않을 때 일어난 일입니다. Epmd가 로컬에 있기 때문에 내 경우에는 문제의 근원이었습니다.

OtpNode의 인스턴스를 작성하기 전에, EPMD이 호스트 시스템에서 실행되고 있는지 확인하십시오 실제로, (OtpNode가 정의되어있는) Jinterface의 문서는 다음과 같은 명시 적 상태.

여기에서 자세한 내용을 찾을 수 있습니다 http://erlang.org/doc/apps/jinterface/jinterface.pdf를 장 1.1.3 노드에.

관련 문제