客戶端
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());
}
}
}