0

我正在使用带有 Java 的 Netty 来尝试配置 TCP 客户端。到目前为止一切正常,除了我在端口 1050 上连接,但是当我在处理程序的 messageReceived() 方法上调用 messageEvent.getRemoteAddress() 时,我得到了端口 1500。我将端口更改为 1049 但我m 仍然收到 1500。这是 Netty 的问题还是服务器的问题?

我这里的硬件设置是:这个netty客户端运行在Java服务器上,几个门禁设备遍布这里。这些设备充当 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));
}

知道为什么我得到 1500 而不是 1050 吗?会不会是设备的问题?

4

1 回答 1

3

每个 TCP 连接都有一个源端口和一个目标端口。当您连接到服务器时,服务器将目标端口视为其众所周知的地址。客户端选择源端口。在任一端,获取“远程地址”都会获取对方的地址。因此,当您在服务器上调用 get remote address 时,您将获得客户端的地址,而不是服务器的地址。

想象一下,您有一台具有一个 IP 地址和一个众所周知的端口的服务器。现在,假设您有一台具有一个 IP 地址的客户端计算机。如果它与服务器建立四个连接,那么任一端如何区分这些连接?答案是客户端端口不同。

于 2012-06-01T15:23:27.340 回答