Java UDP實現檔案傳輸
阿新 • • 發佈:2018-11-02
編寫基於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();
}
}