2017-09-17 95 views
1

的大小,這樣我正當紅的這個代碼片段:一個DatagramPacket類

public static void main (String[] args) throws IOException{ 
    DatagramSocket serverSocket = new DatagramSocket(1500); 
    while(true){ 
     byte[] recieveData = null; //<---look at this #############!!! 
     DatagramPaket recievePaket = new DatagramPacket (recieveData, recieveData.length); 
     serverSocket.receive(recievePaket); 
     String text = recieveData.toString(); 
     if (text.equals("exit")){ 
      serverSocket.close(); 
      System.exit(42); 
     }else if (text.equals("scan")){ 
      scan(); 
     } 
    } 
} 

現在我知道了DatagramPacket的需要緩衝,但它通過如何與「空」初始化?對於我來說,如果不想存儲接收到的數據,但是如何才能看到「退出」還是「掃描」被髮送? 最重要的是,在沒有收到數據包之前,誰能知道緩衝區需要的大小?

+0

'recieveData.length'是空的領域,你確定代碼作品?我試了一下,它沒有,在預期的地方給了一個NullPointer – jrtapsell

+0

不,我不確定它的工作原理,問題基本上是如何做到這一點然後 –

回答

1

以下工作:

public static void main (String[] args) throws IOException { 
    try (DatagramSocket socket = new DatagramSocket(PORT_NUMBER)) { 
     boolean loop = true; 
     final byte[] buffer = new byte[BUFFER_SIZE]; 
     final DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 
     while (loop) { 
     socket.receive(packet); 
     final String text = new String(packet.getData()).trim(); 
     switch (text) { 
      case "exit": 
      loop = false; 
      break; 
      case "scan": 
      scan(); 
      break; 
      default: 
      System.err.printf("Received unknown command `%s`%n", text); 
     } 
     } 
    } 
    } 

不幸的是,你必須設置緩衝區的大小。

的變化我做了包括:

  • 添加緩衝區大小
    • 需要作爲你必須創建一個緩衝區來將數據放到
  • 添加裝飾()刪除換行符,以便netcat可以發送命令。
    • 需要作爲exit\n不等於exit
  • 使用交換機來清理命令路由
    • 使代碼更易於閱讀
  • 使用條件和嘗試資源而不是無限循環
    • 避免了問題,並確保該插座總是關閉退出
  • 添加決賽做出
    • 使它明顯的變量不會改變價值
  • 重命名一些代碼更容易理變量名稱,說明他們是什麼
    • 只是清理,以允許IntelliJ顯示真正的問題
  • 修復已停止編譯
    • 在Ubuntu NC測試輕微錯別字,所以需要編譯
+0

很好的答案!讓ma問一些關於你的答案的問題:BUFFER_SIZE可以設置爲4個字節,因爲我們只希望接收命令「scan」和「exit」?(會自動放棄頂部的換行符)。並且,假設我們希望將其作爲一個無限循環來運行並按照希望的頻率接收「掃描」,是否仍然可以將變量聲明爲final(不這麼認爲,對吧?) –

+0

可以這樣做,修剪確實有助於縮短不過像'foo'這樣的錯誤命令,循環可以運行多次,final只是確保變量在範圍內不被更改 – jrtapsell