【java】UDP文件传输的一个例子

发送端先从本地读取一个文件,以byte数组读取,然后构建一个DatagramPacket通过DatagramSocket对象发送给接收方。
接收方存到本地。两个流程相反。

例子:传输一个图片。大小:1525字节。

代码:

发送方:

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendFile implements Runnable{
    
    
    @Override
    public void run() {
    
    
        send();
    }

    public void send(){
    
    
        try {
    
    
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\...\\test.png"));
            int length=bis.available();
            DatagramSocket ds = new DatagramSocket();
            byte[] buf = new byte[length];
            bis.read(buf);
            DatagramPacket dp = new DatagramPacket(buf,buf.length, InetAddress.getByName("127.0.0.1"),10001);
            ds.send(dp);
            ds.close();
			bis.close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("信息已发送!");
    }
}

接收方:

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveFile implements Runnable{
    
    

    @Override
    public void run() {
    
    
        receive();
    }

    public void receive(){
    
    
        System.out.println("等待信息...");
        try {
    
    
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(
                    "D:\\...\\testtttt.png"));
            DatagramSocket ds = new DatagramSocket(10001);
            byte[] buf = new byte[1024]; // 小于文件大小
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            ds.receive(dp);
            ds.close();
            fos.write(dp.getData());
            fos.flush();
            fos.close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }
}

主方法:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        new Thread(new ReceiveFile()).start();
        new Thread(new SendFile()).start();
    }
}

接收用到的byte数组比我文件大小要小,
这样执行的结果是:(右边是发送的文件,左边是接收的文件)
在这里插入图片描述
把接收方的代码改一下:

byte[] buf = new byte[1024*2]; 

图片就完整了:(文件名相同,旧的图片直接被覆盖)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43750882/article/details/111408359
今日推荐