我正在尝试创建一个服务器来读取文件的内容,并使用数据报包将它们发送到客户端。这是我到目前为止所做的:
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的数据包发送到指定主机上的指定端口号。
我不明白为什么我收到错误,因为我将长度作为第二个参数传递。
答案 0 :(得分:0)
你的代码没有任何意义。您将DatagramPacket
的数据设置为下一行的字节,而不检查EOS,并且您将其长度设置为跟随的长度线,再次没有检查EOS。因此,您最终可以将长度设置为比数据长度更少或更多,这两者都没有意义,并且您可以在任一步骤遇到NullPointerException
,这也没有意义。
readLine()
不可能连续两次传递相同的东西。
在同一个文件中同时使用Scanner
和BuferedReader
也没有任何意义,并期望通过一个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();
}
}