0

見つけてアプリに実装したい 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) で、試すたびに動作します。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例外がスローされるため、おそらく暗号化の失敗ではありません。

4

1 に答える 1

0

さて、ここに問題がありました:

電話が取得していた配列では、両方のメッセージが同時に受信されていました (質問を見て、私が何を意味するかを確認してください)。(バッファ全体の長さを返すため) そのすべてを読み取るだけでしたがInputStream.read()、(長さヘッダーのため) 一部を受け入れていました。最初に 16 バイトのメッセージを読み取り、バッファからクリアした後、そのスペースのゼロを再度読み取りました。

ソリューション?暗号共有と接続されたメッセージの間でサーバーに息を吹き込みます。それは「良い」問題であることが判明しました。私の電話は速すぎます。そのため、古いソフトウェアのエミュレーターで動作しました。(さらに、私は超高速の Nexus 4 を持っているので、それが貢献している可能性があります。)

于 2013-07-03T15:51:50.673 に答える