我是一个了不起的人,这是在实验室之前的一项任务。
我正在尝试使用UDP在UDP中发送文件。
我已经在tcp中完成了它并且开箱即用。虽然我遇到UDP问题。
读取文件,并以1024字节的形式发送。之后,我试图在服务器端抓住它们。
我的想法是,我用于计数的for循环是快速的。
我的输出是一个56kb的大文件(最初是346kb)。一旦客户端程序获得一个字符串(工作),就会输入writeFile方法,然后当这个方法运行时,它将继续进入主循环以获取其他数据。 随着方法的完成,我似乎在控制台中获得了更多输出。 (我使用system.out.println打印所有内容)
这可能是一个速度问题,我已经打印了所有345(353536/1024)个文件并尝试...它正在发送。但没有收到。
有没有办法让服务器“慢下来”?
(我知道UDP没什么值得依赖的,但是localy它不应该丢失数据)
客户端:
public void writeFile(String size, String fileName) {
try {
int test = 0;
int totalSize = Integer.parseInt(size);
BufferedOutputStream bOut = new BufferedOutputStream(new FileOutputStream(fileName));
for (int i = 0; i < totalSize; i++) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(packet);
buffer = packet.getData();
bOut.write(buffer);
totalSize -= 1024;
test++;
}
System.out.println(test);
bOut.close();
} catch (Exception e) {
System.out.println("Download failed, error occured!" + e.getMessage());
}
}
服务器:
if (msgFromClient.toLowerCase().contains("dload")) {
File myFile = new File(msgFromClient.substring(6, msgFromClient.length() - 1)); // read file
int totalSize = (int) myFile.length();
byte[] buffer = ("ok:"+ myFile.getName() + "#" + Integer.toString(totalSize)).getBytes(); // send status + name + size
udp.sendPacket(buffer);
byte[] packageArray = new byte[1024]; // size of package to send
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
// send file in pieces
for (int i = 0; i < totalSize; i++) {
bis.read(packageArray, 0, packageArray.length); // read part of file into byte array
udp.sendPacket(packageArray);
totalSize -= packageArray.length; // reduce total size
}
} else {
byte[] buffer = msgFromClient.getBytes();
udp.sendPacket(buffer);
}
}
private void sendPacket(byte[] buffer) {
try {
DatagramSocket datagramSocket = new DatagramSocket();
InetAddress receiverAddress = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, receiverAddress, 81);
datagramSocket.send(packet);
} catch (Exception e) {
System.out.println(e);
}
}