2013-07-01 20 views
0

我在使用,我发现,想在我的应用程序来实现的java.nio非阻塞服务器的问题:问题与Android中的java.nio 3+

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

因此,这里是什么发生: 每隔一段时间,它都会有效。它可以连接到服务器,做一次小小的握手并准备好来回消息。但更多的时候,它甚至没有获得连接的信息。以下是握手的工作方式:

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以上版本上运行一次。我知道Android的网络方式发生了重大变化,但我唯一知道的是,你不能在主线程上做网络(这不是,这是一个从服务产生的线程)。通过tcpdump确认服务器实际上正在发送连接的消息。

任何帮助都会很棒,它只会在Android 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字节的消息并从缓冲区中清除后,它再次读取它的空间中的零。

解决方案?让服务器在密码共享和连接的消息之间呼吸一下。事实证明这是一个“好”的问题 - 我的手机太快了。这就是为什么它使用旧软件在模拟器中工作。 (另外我有一个闪电般快速的Nexus 4,所以这可能有所贡献。)