0

私はTCPクライアントを構成しようとしているJavaでNettyを使用しています。ポート1050で接続していることを除いて、これまでのところすべてが機能していますが、ハンドラーのmessageReceived()メソッドでmessageEvent.getRemoteAddress()を呼び出すと、ポート1500を取得しています。ポートを1049に変更しましたが、 mはまだ1500を受信して​​います。これはNettyの問題ですか、それともサーバーの問題でしょうか。

ここでの私のハードウェア設定は次のとおりです。Javaサーバー上で実行されているこのnettyクライアントと、いくつかのアクセス制御機器がここの領域に広がっています。機器はtcpサーバーとして機能し、nettyはクライアントとして機能し、サーバーが送信するすべてのものを処理し、それらに応答するだけです。

TCPサーバーの初期化は次のとおりです。

private ChannelFactory fabrica;
private ServerBootstrap bootstrap;

public void iniciarServidorTCP() {
    fabrica = new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(),
            Executors.newCachedThreadPool());
    bootstrap = new ServerBootstrap(fabrica);
    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            ChannelPipeline pipeline = Channels.pipeline();
            pipeline.addLast("decoderDeMensagem", new MensagemDecoderTCP());
            pipeline.addLast("handlerGerente", new GerenteTCP());
            pipeline.addLast("encoder de mensagem", new MensagemEncoderTCP());
            return pipeline;
        }
    });
    bootstrap.setOption("child.tcpNoDelay", true);
    bootstrap.setOption("child.reuseAddress", true);
    bootstrap.bind(new InetSocketAddress(1050));
}

1050ではなく1500を取得する理由はありますか?機器に問題がありますか?

4

1 に答える 1

3

すべてのTCP接続には、送信元ポートと宛先ポートがあります。サーバーに接続すると、サーバーは宛先ポートを既知のアドレスとして認識します。クライアントは送信元ポートを選択します。どちらの場合も、「リモートアドレス」を取得すると、相手側のアドレスが取得されます。したがって、サーバーでget remote addressを呼び出すと、サーバーのアドレスではなく、クライアントのアドレスが取得されます。

1つのIPアドレスと1つの既知のポートを持つサーバーがあるとします。ここで、1つのIPアドレスを持つクライアントマシンがあるとします。サーバーへの接続が4つある場合、どちらの端でもそれらの接続を区別するにはどうすればよいでしょうか。答えは、クライアントポートが異なるということです。

于 2012-06-01T15:23:27.340 に答える