見つけてアプリに実装したい java.nio ノンブロッキング サーバーに問題があります。
では、何が起きているかというと、時々、うまくいきます。サーバーに接続し、小さなハンドシェイクを行い、メッセージのやり取りに備えることができます。しかし、多くの場合、接続されたメッセージを取得することさえできません。ハンドシェイクの仕組みは次のとおりです。
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 以降のバージョンでは、各サーバーのライフ サイクル (開始、実行、終了) で 1 回動作します。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,16
とはメッセージの0,32
長さ (それぞれ 16 と 32) です。これは TwoByteMessageLength.java で定義されています。
さらに、暗号化が失敗すると、大きなEncryptionOperationNotPossibleException
例外がスローされるため、おそらく暗号化の失敗ではありません。