【问题标题】:Issue with java.nio in Android 3+Android 3+ 中的 java.nio 问题
【发布时间】:2013-07-01 15:57:53
【问题描述】:

我发现 java.nio 非阻塞服务器存在问题,并希望在我的应用中实现:

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)。它在高于 3.0 的 Android 版本的每个服务器生命周期(启动、运行、终止)中工作一次。我知道 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 异常。

【问题讨论】:

  • 如果您在客户端 Android 端遇到任何异常,握手中是否有任何地方描述它出错,并且您在操作期间是否持有 Android 唤醒锁?
  • Android端没有抛出异常。我没有持有唤醒锁,我编辑了关于握手失败的问题,因为我认为这可以澄清它。
  • 您是否有充分的理由不为此使用 SSL?
  • 确实没有什么好的理由。我基本上想要一种简单快速的方式来做一个 nio 服务器/客户端。这就是为什么我没有直接搞乱 java 加密的原因——我最后一次尝试过,它抛出了一堆非法块异常。 Jayspt 处理了这个问题,并且在功能上包含了比我想象的更多的密码学。至于 SSL,我的学习还没有完全做到。显然 nio 对我来说是新的,所以这将是下一个。 ;)

标签: java android nio android-3.0-honeycomb


【解决方案1】:

好的,问题来了:

在电话收到的数组中,两条消息同时进入(查看问题以了解我的意思)。它只是读取所有内容(由于InputStream.read() 返回整个缓冲区的长度),但接受了其中的一部分(由于长度标头)。在它读取开头的 16 字节消息并将其从缓冲区中清除后,它再次读取其空间中的零。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2017-01-10
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多