2012-06-01 30 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連接,使用幾乎相同的設置,並且端口綁定是完美無瑕的。 –