Java 数据包的大小

Java 数据包的大小,java,arrays,network-programming,Java,Arrays,Network Programming,所以我只是把这段代码涂成红色: public static void main (String[] args) throws IOException{ DatagramSocket serverSocket = new DatagramSocket(1500); while(true){ byte[] recieveData = null; //<---look at this #############!!! DatagramPaket

所以我只是把这段代码涂成红色:

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();
        }
    }
}
publicstaticvoidmain(字符串[]args)抛出IOException{
DatagramSocket serverSocket=新DatagramSocket(1500);
while(true){
字节[]receivedata=null;//以下工作:

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);
        }
      }
    }
  }
不幸的是,您必须设置缓冲区大小

我所做的改变包括:

  • 添加缓冲区大小
    • 需要,因为您必须创建一个缓冲区将数据放入
  • 添加trim()以删除换行符,以便netcat可以发送命令。
    • 退出时需要\n
不等于退出
  • 使用交换机清理命令路由
    • 使代码更易于阅读
  • 使用条件并尝试使用资源,而不是无限循环
    • 避免问题,并确保插座在退出时始终关闭
  • 添加期末考试以使代码更易于推理
    • 很明显哪些变量永远不会改变值
  • 将某些变量重命名为解释其用途的名称
    • 只需清理即可让IntelliJ显示真正的问题
  • 修复停止编译的小错误
    • 在Ubuntu上用nc测试,所以需要编译

  • receivedata.length
    是一个空字段,你确定代码有效吗?我尝试了,但没有成功,在预期的位置提供了一个空指针。不知道它是否有效,问题是基本上如何做。很好的答案!让我问几个关于你答案的问题:缓冲区大小可以设置为4字节吗,因为我们只希望重新设置接收命令“scan”和“exit”?(将自动放弃顶部的换行符)。并且,假设我们希望以无限循环的形式运行此命令,并根据需要随时接收“scan”,是否仍然可以将变量声明为final(不这样认为,对吗?)当然,trim确实有助于显示短的错误命令,如
    foo
    ,不过,循环可以运行多次,final只是确保变量在范围内时不会更改