質問

プロトコルの一部として、新しい接続が確立されたときにクライアントにバージョン番号を送信してもらいたいのですが。これをパイプラインの別のハンドラーで実行したいので、これはかなり基本的な質問かもしれませんが、方法がわかりませんので、ご容赦ください。もう1つは、接続(パイプライン)を介してPOJOを送受信できるようにしたいということです。また、認証ハンドラーを追加したいと思います。とにかく、今、私はある種のエラーを受け取っています、そしてそれはバージョンチェックがパイプラインから適切に消化されていないためだと確信しています。

基本的に、以下のコードは、接続が確立されたときにバージョンがチェックされた後にサーバーが出力する「HelloWorld」を送信するように設定されています。少なくとも理論的には、実際にはこれは完全には機能していません;)

現在私が持っているもの:

Client.java ジェネラコディセタグプレ

VersionClientHandler.java ジェネラコディセタグプレ

BusinessLogicClientHandler.java ジェネラコディセタグプレ

Server.java ジェネラコディセタグプレ

VersionServerHandler.java ジェネラコディセタグプレ

BusinessLogicServerHandler.java ジェネラコディセタグプレ

基本的に私が欲しいのは、チャネルが通信プロトコルの一部として接続されたときにバージョン番号が渡され、検証されることです。すべてが舞台裏で自動的に行われます。同様に、この方法で認証メカニズムを渡したいと思います。

Secure Chatの例でやりたいように見えるコードをいくつか見ましたが、実際には理解できませんでした。このコードを設定する方法についての助けは本当にありがたいです。 1つの大規模なハンドラーですべてを実行できることはわかっていますが、それがパイプラインのポイントであり、論理的に意味のあるユニットに分割します。

役に立ちましたか?

解決

解決策を見つけました!!!

いくつかの問題がありました。

VersionClientHandlerでは、新しいコードは次のとおりです。 ジェネラコディセタグプレ

最後の行、e.getChannel().write(version);ではなくChannels.write(ctx, e.getFuture(), versionBuffer);に注意してください。理由はわかりません。 実際、何もしていないように見えるので、なぜChannelBuffersコードがそこにあるのかを調べ始めようとしています...

VersionServerHandler.javaには、次のものがあります。 ジェネラコディセタグプレ

バッファをもう読み取らないことに注意してください。e.getMessage()を実行して、正しいタイプのオブジェクトにキャストするだけです。この上に、そのハンドラーをそれ以上の処理から削除するためにあるctx.getPipeline().remove(VersionServerHandler.class);を追加しました。最初の接続後は不要になりました。そのヒントをくれたデニスに感謝します。

結論

残りは私が期待した通りです。重要なのは、バッファを読み取って情報を渡す方法を正しく理解していなかったことです。そして、エラーメッセージと例は完全に明確ではありませんでした。 NettyからパイプラインにPOJOチャネルを追加するとすぐに、すべてのハンドラーについて、オブジェクトのみの処理を開始する必要があります。私はそれを逃した。コンセプトは正しかった、それは私が間違っていたチャンネルからデータを読み取ろうとした方法です。

もう1つの大きなヒントは、最初の接続後にハンドラーが必要ない場合は、パイプラインからハンドラーを削除することでした。認証ハンドラーについても同じことが言えると思います。ここで確認できれば素晴らしいのですが、後で確認する必要があります。

他のヒント

表示されているエラーについては言及していません。

いずれの場合も、バージョンチェックを行うために別のチャネルハンドラーを使用することはお勧めしません。主な理由は、接続が最初に確立されたときに、バージョンチェックを1回だけ実行する必要があるためです。また、チャネルハンドラーは、トランスポート層の問題に対処するのが最善だと思います。バイトをpojoに変換します。

カスタムハンドラーを追加することで、やりたいことを簡単にアーカイブできると思います。したがって、バージョンチェックでは、channelConnected(....)をオーバーライドするハンドラーを追加し、そこでrheチェックを実行できます。authの場合、バージョンチェックの後にmessageRecieved(....)メソッドをオーバーライドする別のハンドラーを追加するだけです。認証が完了したら、パイプラインからハンドラーを削除し、必要に応じて再度追加できます。

BusinessLogicハンドラーは、最後のハンドラーとしてパイプラインに配置する必要があります。ハンドラーのいずれかが何らかのブロック操作を実行することに注意してください。その前にExecutionHandlerを追加して、ioworkerスレッドがブロックされないようにし、nettyサーバーを無責任にすることを検討する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top