2013-07-01 1 views
0

3+ :문제는 내가 발견하고 내 응용 프로그램에서 구현하고자하는 java.nio의 비 차단 서버에 문제가 있어요

https://code.google.com/p/java-toys/source/browse/#svn%2Ftrunk%2FExample_NIO_Server%2Fsrc%2Fcom%2Fcordinc%2Futil%2Fnetwork

그래서 여기에 무엇 일어나는 : Every-so-often, 그것은 작동합니다. 서버에 연결할 수 있으며, 작은 악수 일뿐 아니라 메시지를주고받을 준비가되어 있습니다. 하지만 종종 연결 메시지를받지도 못합니다. 핸드 셰이크가 작동하는 방법은 다음과 같습니다.

Server sends cipher for encryption 
Server sends "connected" to test connection and encryption 
Client sends username 
Server sends acknowledgment 
Client sends password 
Server sends acknowledgement 
Server sends login success if that's the case 
Client sends acknowledgment of login 
Server asks for uuid 
Client provides uuid 
Server says it's ready 
Client says it's ready 
The handshake is complete and message transfer can begin 

암호화에 jasypt가 사용됩니다.

Android 2.2, 2.3 및 Mac OS X (Java 1.6)에서 사용 가능합니다. Android 3.0 이상 버전에서는 각 서버 라이프 사이클 (시작, 실행, 종료) 동안 한 번 작동합니다. 안드로이드가 네트워크를 어떻게 운영하는지에 대한 중요한 변화가 있었지만, 내가 아는 유일한 것은 당신이 메인 쓰레드에서 네트워크를 할 수 없다는 것입니다 (이것은 아닙니다, 이것이 서비스에서 생성 된 쓰레드입니다). 서버가 실제로 연결된 메시지를 보내고 있다고 tcpdump으로 확인했습니다.

어떤 도움도 좋을 것입니다. 이상하게도 안드로이드 3 이상에서만 작동합니다.

사전에 도움을 주셔서 감사합니다.

편집 : 핸드 셰이크가 실패한 부분을 분명히하지 않았습니다. 클라이언트가 암호를 수신하면 실패합니다. 디버깅을 통해, 나는 그것이 읽기 버퍼에있는 유일한 것은 아니기 때문에 클라이언트는 연결된 메시지를 받고 있음을 알고

Cipher: 
[0, 16, 102, 69, 106, 80, 101, 56, 77, 72, 118, 117, 77, 75, 85, 100, 57, 78, 
Connected: 
0, 32, 53, 106, 43, 69, 104, 122, 87, 100, 109, 67, 85, 90, 121, 65, 83, 57, 98, 65, 78,  73, 103, 103, 66, 55, 103, 54, 55, 106, 54, 108, 54, 53, ...(Rest of buffer is zeros)...] 

0,160,32 메시지 길이 (16, 32, 각각)입니다. 이는 TwoByteMessageLength.java에 정의되어 있습니다.

또한 암호화가 실패한 것은 아니기 때문에 'EncryptionOperationNotPossibleException 예외가 발생합니다. (내가 무엇을 의미하는지에 관해 알기 위해 질문을보고)

전화가 점점 된 배열에서

이 두 메시지를 한 번에오고 있었다 :

+1

클라이언트 Android 측에 어떤 예외가 발생하면 핸드 셰이크에 오류가있는 것으로 표시되어 있고 보유하고있는 위치가 있습니까? 작업 중 Android wakelock? –

+0

Android 측면에서 예외가 발생하지 않습니다. 깨우기 잠금을 갖고 있지 않으며 핸드 셰이크가 실패한 부분에 대한 질문을 편집했습니다. –

+0

SSL을 사용하지 않는 데는 어떤 이유가 있습니까? – EJP

답변

0

좋아, 그래서 여기에 문제가 있었다. 그것은 단지 (전체 버퍼의 길이를 되 돌리는 InputStream.read() 때문에) 모든 것을 읽었을 뿐이지 만 (길이 헤더 때문에) 그것들 중 일부를 받아 들인다. 처음에 16 바이트 메시지를 읽고 버퍼에서 지우면 다시 공간의 0을 읽습니다.

해결책? 서버가 암호화 공유와 연결된 메시지 사이에서 숨을 쉬게합니다. "좋은"문제였습니다. 전화가 너무 빠릅니다. 그래서 이전 소프트웨어가 탑재 된 에뮬레이터에서 작동했습니다. (또한 번개 빠른 Nexus 4가 있으므로 기여했을 수 있습니다.)

관련 문제