2017-02-21 25 views
-1

Я пытаюсь создать сервер, который считывает содержимое файла и отправляет его клиенту с использованием пакетов датаграмм. Вот то, что я до сих пор:Длина пакета пакета данных JAVA или ошибка смещения

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); 
    } 
} 

Когда я запускаю это, я получаю сообщение об ошибке:

Исключения в потоке «основной» java.lang.IllegalArgumentException: нелегальные длины или смещениях

конструктор я использую

DatagramPacket (байт [] ЬиЕ, Int длина, InetAddress обратить внима ss, int port)

Создает пакет дейтаграммы для отправки пакетов длины длины указанному номеру порта на указанном хосте.

Не понимаю, почему я получаю сообщение об ошибке, так как передаю длину как второй параметр.

+0

Возможный дубликат http://stackoverflow.com/questions/28450619/unable-to-set-the-offset-for-buffer-in-the-datagrampacket-object – Lemonov

ответ

0

Ваш код не имеет никакого смысла. Вы устанавливаете данные DatagramPacket в байты следующей строки, не проверяя EOS, и вы устанавливаете ее длину на длину , следующую за, и снова без проверки на EOS. Таким образом, вы можете установить длину меньше или больше, чем длину данных, ни одна из которых не имеет смысла, и вы можете встретить NullPointerException на любом этапе, что также бессмысленно.

readLine() не может поставлять одну и ту же вещь дважды подряд.

Также не имеет смысла использовать как Scanner, так и BuferedReader в том же файле, и ожидать ввода-вывода через один, чтобы повлиять на другой.

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(); 
    } 
}