Ftp文件上傳的實現

客戶端

package question10;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

/*
 * 使用TCP協議寫一個可以上傳文件的服務器和客戶端。
 * 
 * 客戶端類
 * 
 * 老師運行完要F5刷新下項目
 */

public class FTPClient
{
	public static void main(String[] args) throws Exception
	{
		//鏈接服務器,127.0.0.1表示本機,5678爲端口號
		Socket socket = new Socket("127.0.0.1", 5678);
		System.out.println("conneted server");
		

		//需要上傳的文件路徑,這裏是當前這個java源文件
		String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"
				+File.separator+"FTPClient.java";

		//根據路徑鏈接到本機文件系統
		File file = new File(path);
		
		//取得到服務器的輸出流,用來寫入數據
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		System.out.println("start write");
		writeHead(dos, file);
		writeFile(dos, file);
		System.out.println("write finished");
	}
	
	/**
	 * 寫傳輸頭,這裏只是文件名字
	 */
	public static void writeHead(DataOutputStream dos, File file) throws IOException
	{
		dos.writeUTF(file.getName());
		dos.flush();
	}
	
	/**
	 * 讀取文件並傳輸給服務器
	 */
	public static void writeFile(DataOutputStream dos, File file) throws IOException
	{
		DataInputStream dis = new DataInputStream(new FileInputStream(file));
		//超過兩個G的文件會出問題,獲取不到準確的大小
		//並且dis.available() > 0表達式也不能正確
		//工作
		dos.writeInt(dis.available());
		System.out.println("file size " + dis.available() + " bytes");
		while(dis.available() > 0)
		{
			dos.write(dis.read());
		}
		dos.flush();
	}
}


服務器
package question10;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 使用TCP協議寫一個可以上傳文件的服務器和客戶端。
 * 
 * 服務器類
 * 
 * 老師運行完要F5刷新下項目
 */
public class FTPServer
{
	public static void main(String[] args) throws Exception
	{
		//啓動服務器,並監聽5678端口的鏈接請求
		ServerSocket ss = new ServerSocket(5678);
		Socket client = ss.accept();
		System.out.println("client conneted");
		
		//建立到客戶端的輸入流,用以讀取數據
		DataInputStream dis = new DataInputStream(client.getInputStream());
		//讀取數據頭,即文件名
		String fileName = readHead(dis);
		System.out.println("start read " + fileName);
		
		//服務器將要保存從客戶端上傳的文件的路徑
		//這裏是當前這個服務器java源文件的所在目錄
		//傳完F5刷新下項目
		String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"
				+File.separator;
		//給保存的文件加了點東西,要不就把這個客戶端
		//那個java源文件給覆蓋了,看不出來效果
		File file = new File(path + fileName.replace(".", "$1."));
		readFile(dis, file);
		System.out.println("read finished");
	}
	
	/**
	 * 讀取並返回數據頭,也就是文件名字
	 */
	public static String readHead(DataInputStream dis) throws IOException
	{
		return dis.readUTF();
	}
	
	/**
	 * 讀取客戶端傳來的文件數據並寫入本地文件
	 */
	public static void readFile(DataInputStream dis, File file) throws IOException
	{
		//取得文件大小
		int length = dis.readInt();
		//將文件數據寫如本地文件
		DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
		//創建文件
		file.createNewFile();
		for (int i = 0; i < length; i++)
        {
	        dos.write(dis.read());
        }
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章