2010-01-22 61 views
2

我創建了一個服務器(現在稱爲Server1),它與另一臺服務器(現在稱爲Server2)進行通信。Java套接字問題,不會偵聽多個數據報包

  • Server1向Server2發送一個數據報文包。
  • Server2應該發回兩個數據報包,但我只得到一回。
  • Server2不是問題,併發送兩個包。

我使用Wireshark來嗅探離開並進入Server1的軟件包。

包一個(從Wireshark的): 「5955 11994.023974 192.168.1.3 192.168.1.2 UDP源端口 :50000目的端口:50004」

套餐二(來自Wireshark的): 5958 11994.045830 192.168。 1.3 192.168.1.2 ICMP目標不可達(端口不可達)

Server1運行正在偵聽數據報包的線程。

代碼服務器1:

 while (m_keepRunning) 
    { 
     try 
     { 
     TermMsg receivedMessage = null; 
     receivedMessage = receive(); //See this function further down 
     if (receivedMessage != null) 
      { 
       if (receivedMessage.getMsgType().equals(TermMsgType.ACK)) 
       { 
       System.out.println("This is an ack!"); 
       } 
       else 
       { 

       System.out.println("This is a response"); 
       } 
      } 
     else 
     { 
      System.out.println("This is nothing"); 
     } 

     } 

接收功能:

 private TermMsg receive() throws IOException, TermMsgException 
{ 
    byte[] inBuf = new byte[BUF_SIZE_RX]; 
    DatagramPacket inData = new DatagramPacket(inBuf, BUF_SIZE_RX); 

    if(true == firstEncounter) 
    { 
      StartMessage startReq = getStartMsg(false); 
    DatagramPacket p = makeDatagramP(startReq); 
    socket.send(p); 
    firstEncounter = false; 
    } 

    socket.receive(inData); 
    if (inData.getLength() > 0) 
    { 
     Msg msg; 
     try 
     { 
      msg = Msg.createFromUdp(inData.getData()); 
      return msg; 
     } 
     catch (TermMsgException e1) 
     { 
      return null; 
     } 
    } 
    else 
    { 
    try 
     { 
      Thread.sleep(100); 
     } 
     catch (InterruptedException e) 
     { 

     } 
     return null; 
    } 
} 

沒有人有線索? 順便說一句...我還使用:

DatagramSocket socket; 
try { 
    socket = new DatagramSocket(50004); 
} 

我是否必須使用服務器套接字,使其監聽超過一個數據報封裝?

摘要: - 端口不可達 - 無法接收包二號

希望有人能幫助我。 在此先感謝

+1

你爲什麼認爲你從server2發送兩個數據包?我不知道wireshark,但它看起來像你只發送一個UDP數據包。第二條日誌消息看起來是一個ICMP數據包,這是一個不同的協議。 – kdgregory

+0

我認爲ICMP是一條消息,可以告訴你udp或tcp數據包是否未達到其目標。但看起來你是對的。 做了一個小包客戶端,它將包發送到Server1,並作出響應。 所以看起來像Server2根本不會發送兩個包。 – Ikky

回答

1

正如在問題的評論中已經提到的,第一個問題是您假設以下兩行是兩個正在發送的UDP數據包。

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004" 

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable) 

事實上,這可能是一個不完整的跟蹤,因爲這正顯示出兩個包:

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004" 

這是一個UDP數據包,從服務器2(192.168.1.3)到server1(192.168。 1.2)。它被髮送到server1上的端口50004。

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable) 

這是從服務器2發送到服務器1的控制消息,表示由於目標端口未打開而無法傳送以前的數據包。這是從服務器1到服務器2的先前數據包傳遞嘗試的答案,這是行不通的。這可能有助於解釋爲什麼你沒有得到你期望的所有數據包?

+0

「這是從服務器1到服務器2的先前數據包傳送嘗試的答案」 - 這是我一直在想的事情,但我不明白爲什麼它無法到達目的地。 - 正如我在另一條評論中所說的,我製作了一個腳本,它發送了一個包到Server1的包,並且他們到達了目標。 – Ikky

+0

它仍然顯示來自wireshark的包2,但我現在已經完成了接收這兩個包。 感謝您的頭腦風暴; kdgregory和Paul Wagland :) – Ikky

+0

是否有阻止訪問端口的防火牆? –