1. 程式人生 > >Java UDP實現檔案傳輸

Java UDP實現檔案傳輸

編寫基於TCP/IP網路利用UDP通訊的二進位制檔案傳輸程式,傳輸到指定對端後要存檔。
利用FileStreams類實現檔案傳輸。

程式存放格式:
在這裡插入圖片描述
Receive_Thread.java

package UDP_File;

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

public class Receive_Thread extends
Thread{ private static final int MAX_RECEIVE_BUFFER = 1024; //最大接收快取 private DatagramSocket server; //DatagramSocket類用來建立伺服器和客戶端 private DatagramPacket packet; //DatagramPacket類用來存入和解包UDP資料 byte[] buffer = new byte[MAX_RECEIVE_BUFFER]; //建構函式 public Receive_Thread(DatagramSocket server)
{ this.server = server; packet = new DatagramPacket(buffer, buffer.length); } public void run() { try { File dest = new File("C:\\Users\\Ramer\\Desktop\\copy\\LICEcap.exe"); //要接收的檔案存放路徑 FileOutputStream output = new FileOutputStream(dest); int
len = 0; //資料長度 while (len == 0) { //無資料則開始迴圈接收資料 //接收資料包 server.receive(packet); len = packet.getLength(); if (len > 0) { //指定接收到資料的長度,可使程式正常接收資料 output.write(buffer,0,len); output.flush(); len = 0;//迴圈接收 } } } catch (IOException e) { e.printStackTrace(); } } }

Send_Thread.java

package UDP_File;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class Send_Thread extends Thread {

    //傳送的socket端
    private DatagramSocket sender = null;
    //待發送的目標地址,InetSocketAddress用來儲存IP套接字地址
    private InetSocketAddress address = null;
    //接收鍵盤輸入
    Scanner scan = new Scanner(System.in);

    //建構函式
    public Send_Thread(DatagramSocket sender, InetSocketAddress address) {
        this.sender = sender;
        this.address = address;
    }

    public void run() {
        try {
            File source = new File("C:\\Users\\Ramer\\Desktop\\LICEcap.exe");  //要傳輸的檔案路徑
            InputStream inputstream = new FileInputStream(source);
            byte[] data = new byte[1024];
            //建立UDP資料報
            while ((inputstream.read(data)) != -1) {
                DatagramPacket pack = new DatagramPacket(data, data.length, address);
                sender.send(pack);
                TimeUnit.MICROSECONDS.sleep(1); //限制傳輸速度
            }

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Create.java

package UDP_File;

import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Create {   //建立伺服器和客戶端的類與方法
    private int DEST_PORT = 0;
    private int SEND_PORT = 0;
    private int RECE_PORT = 0;
    private String IP = null;
    //建構函式儲存IP和埠
    public Create(int DEST_PORT, int SEND_PORT, int RECE_PORT, String IP) {
        this.DEST_PORT = DEST_PORT;
        this.SEND_PORT = SEND_PORT;
        this.RECE_PORT = RECE_PORT;
        this.IP = IP;
    }
    public void run(){
        try {
            Send_Thread send_thread = null;
            Receive_Thread receive_thread = null;
            InetSocketAddress address = null;
            //建立待接受資料包的目的機的埠號和IP地址
            address = new InetSocketAddress(IP, DEST_PORT);
            //建立傳送的Socket端
            DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
            //建立接受的Socket端
            DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
            //傳送執行緒建立
            send_thread = new Send_Thread(sendsocket, address);
            //接受執行緒的建立
            receive_thread = new Receive_Thread(recesocket);

            send_thread.start();  //開啟執行緒
            receive_thread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Server.java

package UDP_File;

public class Server {

    private static final int DEST_PORT = 6666;
    private static final int SEND_PORT = 10001;
    private static final int RECE_PORT = 8888;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

Client.java

package UDP_File;

public class Client {

    private static final int DEST_PORT = 8888;
    private static final int SEND_PORT = 10000;
    private static final int RECE_PORT = 6666;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

在這裡插入圖片描述