一个DatagramPacket类

问题描述:

的大小,这样我正当红的这个代码片段:一个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

不,我不确定它的工作原理,问题基本上是如何做到这一点然后 –

以下工作:

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