发送端先从本地读取一个文件,以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];
图片就完整了:(文件名相同,旧的图片直接被覆盖)