JAVA数据报包长度或偏移错误

时间:2017-02-21 08:29:14

标签: java networking udp

我正在尝试创建一个服务器来读取文件的内容,并使用数据报包将它们发送到客户端。这是我到目前为止所做的:

    public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {

    BufferedReader br = new BufferedReader(new FileReader("File.txt"));

    Scanner sc = new Scanner(new File("File.txt"));

    DatagramSocket ds = new DatagramSocket();

    while(sc.hasNextLine()){
        DatagramPacket multi = new DatagramPacket(br.readLine().getBytes(), br.readLine().getBytes().length, InetAddress.getByName("224.0.0.5"), 7777);
        ds.send(multi);
        sc.nextLine();
        sleep(1000);
    }
}

当我运行此操作时,出现错误

  

线程“main”中的异常java.lang.IllegalArgumentException:非法长度或偏移量

我正在使用的构造函数是

  

DatagramPacket(byte [] buf,int length,InetAddress address,int port)

     

构造一个数据报包,用于将长度为length的数据包发送到指定主机上的指定端口号。

我不明白为什么我收到错误,因为我将长度作为第二个参数传递。

2 个答案:

答案 0 :(得分:0)

你的代码没有任何意义。您将DatagramPacket的数据设置为下一行的字节,而不检查EOS,并且您将其长度设置为跟随的长度线,再次没有检查EOS。因此,您最终可以将长度设置为比数据长度更少或更多,这两者都没有意义,并且您可以在任一步骤遇到NullPointerException,这也没有意义。

readLine()不可能连续两次传递相同的东西。

在同一个文件中同时使用ScannerBuferedReader也没有任何意义,并期望通过一个I / O完成另一个I / O.

答案 1 :(得分:0)

您不需要为文本文件的每一行重新创建数据包。 试试这段代码。

public static void main(String[] args) {

    try {
        // Creaete a reader
        BufferedReader reader = new BufferedReader(new FileReader("File.txt"));

        //Create a socket
        DatagramSocket socket = new DatagramSocket();

        // Create a packet
        byte[] data = new byte[1024]; // Max length
        DatagramPacket packet = new DatagramPacket(data, data.length);

        // Set the destination host and port 
        packet.setAddress(InetAddress.getByName("localhost"));
        packet.setPort(9999);

        String line = null;
        while((line = reader.readLine()) != null){
            //Set the data
            packet.setData(line.getBytes());
            //Send the packet using the socket
            socket.send(packet);
            Thread.sleep(200);
        }

        //Close socket and file
        reader.close();
        socket.close();

    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
}