0

サーバーは通常、次のことを行います。

-Netty サーバーは、tcp ポートで clientX バインドを受信します (すべて非常に単純なテキスト プロトコル)。

-Netty は認証リクエストを受け取ります。

-Netty は clientX というチャネル グループを作成します。このチャネル グループ内で、4 つの TCP 接続 (各外部サーバーに 1 つ) を作成し、サーバーでユーザーの認証を実行し、1 つの ACK を clientX に送り返します。

- clientX から次のリクエストを受信すると、clientX のチャネル グループ内の connection1 にメッセージがルーティング/リレーされます。

-次のメッセージを受信し、clientX のチャネル グループ内の connection2 に要求をルーティング/リレーします。

-ログアウト要求を受け取り、チャネル グループを切断します。これにより、clientX のチャネル グループ内のすべての接続が切断されます。

-外部サーバーのいずれかから受信したメッセージは、clientx (mux) にルーティング/リレーする必要があります。

4

1 に答える 1

2

そのようなことはnettyで行うことができます。

良い出発点はプロキシの例だと思います:

https://github.com/netty/netty/tree/3/src/main/java/org/jboss/netty/example/proxy


上記のように、サーバーを実装するためにプロキシの例を変更しました。設計: netty-3.5.3 を使用

クライアント<->|(s-soc)-MUX_NIO_server-(c-socks) |<->server1(lb)

                                        |<->server2
                                        |<->server3
                                        |<->server4

パイプライン=>framedecoder-->stringdecoder-->clienthandler-->framedecoder-->stringdecoder-->serverHandler--|

+/- 100 tps に達するまで 100% 実行され、クライアントからの同じメッセージがサーバーに何度も送信され、デッドロック状態のように見えます。

両方のハンドラーで、私の channelInterestChanged イベントは次のようになります。

//channelInterestChanged 同期 (trafficLock) {

  if (e.getChannel().isWritable()) {

        inboundChannel.setReadable(true);

          if (inboundChannel != null) {

             inboundChannel.setReadable(true);
         }

  }

}

両方のハンドラー メッセージ rx で、次のように記述します。

同期 (trafficLock) {

final ChannelFutureListener writeListener =
                new ChannelFutureListener() {

                    @Override
                    public void operationComplete(final ChannelFuture future)
                            throws Exception {
                        if (Consts.DEBUG_ENABLED) {
                            log.debug("Finished Writing message);
                        }
                    }
                };

        /* if channel is write */
        if (inboundChannel.isWritable()) {
                inboundChannel.write(bufferMsg).addListener(writeListener);
        }
        // If inboundChannel is saturated, do not read until notified in
         if (!inboundChannel.isWritable()) {
            e.getChannel().setReadable(false);
        }

}

何が間違っている可能性があり、これを修正するためにどこを探すべきか考えていますか?ありがとう

于 2012-06-15T05:22:35.907 に答える