2012-06-01 25 views
0

我正在使用Netty与Java试图配置一个TCP客户端。一切工作到目前为止,除了我连接端口1050,但是当我调用处理程序的messageReceived()方法messageEvent.getRemoteAddress(),我得到端口1500.我更改端口为1049,但我'米仍然收到1500.这是Netty的问题,或者它可能是服务器的问题?Netty给我一个错误的端口使用TCP

我在这里的硬件设置是:这个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?这可能是设备的问题吗?

回答

3

每个TCP连接都有一个源端口和一个目标端口。当您连接到服务器时,服务器将目标端口视为其已知地址。客户端选择源端口。在任何一方,获取“远程地址”都会得到对方的地址。所以当你打电话到服务器上获取远程地址时,你会得到客户端的地址,而不是服务器的地址。

想象一下,您拥有一台拥有一个IP地址和一个知名端口的服务器。现在,假设你有一台拥有一个IP地址的客户机。如果它连接到服务器的四个连接,那么两端如何区分这些连接?答案是客户端端口是不同的。

+0

嗯,是的,我知道,它应该是这样,问题是它不是那样。服务器和客户端都配置了端口1050,但我以某种方式收到1500,这就是我想知道为什么 –

+1

客户端绑定到端口1050?你测试过,以确保绑定成功吗? (如果你知道,为什么你粘贴所有不相关的代码?服务器如何设置它的端口与涉及客户端如何设置其端口以及服务器如何确定客户端端口的问题无关。) –

+0

绑定成功是因为我能够与设备进行通信,并且是的,客户端绑定到端口1050,否则它将不会从服务器接收数据。由于我在这方面的知识有限,所以我粘贴了代码,所以我认为这可能是因为启动时配置错误。我会做更多的测试,以确保绑定是正确的,如果是的话,我真的不知道它有什么问题,因为在同一个项目中,我也有UDP连接,使用几乎相同的设置,并且端口绑定是完美无瑕的。 –