我正在使用Netty和Java尝试配置TCP客户端。到目前为止一切正常,除了我在端口1050上连接但是当我在处理程序的messageReceived()方法上调用messageEvent.getRemoteAddress()时,我得到了端口1500.我将端口更改为1049但是我'我仍然收到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?这可能是设备的问题吗?
答案 0 :(得分:3)
每个TCP连接都有一个源端口和一个目标端口。连接到服务器时,服务器将目标端口视为其已知地址。客户端选择源端口。在任何一端,获取“远程地址”获取另一方的地址。因此,当您在服务器上调用get remote address时,您将获得 client 的地址,而不是服务器的地址。
想象一下,您的服务器具有一个IP地址和一个众所周知的端口。现在,假设您有一台具有一个IP地址的客户端计算机。如果它与服务器建立了四个连接,那么它们如何将这些连接区分开来?答案是客户端端口不同。