通过UDP Java发送文件

时间:2015-10-12 21:16:11

标签: java udp datagram

我是一个了不起的人,这是在实验室之前的一项任务。

我正在尝试使用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);
    }
}

0 个答案:

没有答案