1.用戶端引入庫
代碼如下(示例):
package TCP_and_UDP;
import java.io.*;
import java.net.Socket;
2.用戶端代碼
代碼如下(示例):
public class Client {
private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
in();
}
public static void in() throws IOException {
//建立緩沖區存儲從鍵盤錄入的資訊,主要是一整行一整行地讀
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//擷取檔案路徑
System.out.println("請輸入檔案所在的目錄以及檔案名稱,以Enter鍵結束(例如:G:\\IdeaProjects\\untitled\\一路向北.mp3)");
String dir = bufr.readLine();
//擷取檔案類型
System.out.println("請輸入上傳的檔案類型,以Enter鍵結束(例如:.mp3)");
String name = bufr.readLine();
//擷取IP位址
System.out.println("請輸入你要上傳的IP位址,以Enter鍵結束");
String ip = bufr.readLine();
//關閉資源
bufr.close();
//調用運作用戶端所在的方法,并将檔案路徑,檔案類型和IP位址作為參數傳入
free(dir,ip,name);
}
public static void free(String dir,String ip,String name) throws IOException {
//建立Socket對象,這是必須要做的,因為用戶端和服務端就是靠這個連接配接,10005為端口号
//不建議使用1024以内的端口号
Socket s = new Socket(ip,10005);
//讀取用戶端要上傳的檔案
FileInputStream bufi = new FileInputStream(dir);
//将讀到的檔案資料發送給服務端
PrintStream out = new PrintStream(s.getOutputStream(),true);
//将檔案類型告訴伺服器,以便于生成對應類型的檔案
PrintWriter out1 = new PrintWriter(s.getOutputStream(),true);
out1.println(name);
//建立數組存儲讀到的檔案的位元組資訊
byte[] buf = new byte[SIZE];
int len = 0;
while((len = bufi.read(buf))!=-1)
{
//将讀到的資料傳給伺服器端
out.write(buf,0,len);
}
//告知服務端資料發送完畢,讓服務端停止讀取,否則服務端将一直等待讀取
s.shutdownOutput();
//讀取服務端發回來的應答消息,這裡用緩沖區是不想建立一個數組了
BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
//這裡沒有加while語句是因為已經知道應答消息隻有:上傳成功,是以不需要,但為了嚴謹,根據需求添加
String str = bufr.readLine();
//輸出從服務端擷取的應答消息
System.out.println(str);
//關流,關閉資源,PrintStream和PrintWriter會随着Socket的關閉而關閉
s.close();
bufi.close();
bufr.close();
}
3.服務端引入庫
package TCP_and_UDP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
4.服務端代碼
public class Server {
private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
free();
}
public static void free() throws IOException {
//建立伺服器端ServerSocket對象,用戶端和伺服器端的端口必須一緻才能進行連接配接
ServerSocket ss = new ServerSocket(10005);
//擷取連接配接進來的用戶端Socket對象......這裡可能說得不對
Socket s = ss.accept();
//列印連接配接進來的用戶端的IP,并且列印是否連接配接成功
System.out.println(s.getInetAddress().getHostAddress()+".......連接配接成功");
//從流中讀取用戶端發來的資料
InputStream in = s.getInputStream();
//這個是從流中擷取檔案的類型,因為是用字元流傳過來的是字元串,是以用字元流
BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = bufr.readLine();
//建立檔案
FileOutputStream fos = new FileOutputStream("server"+name);
byte[] buf = new byte[SIZE];
int len = 0;
while((len = in.read(buf))!=-1)
{
//将資料寫入檔案
fos.write(buf,0,len);
fos.flush();
}
//建立PrintWriter對象,告訴用戶端檔案上傳成功
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("上傳成功");
//關閉資源
s.close();
ss.close();
fos.close();
}
總結
以上就是全部内容,本文僅僅粗略地實作了用戶端向服務端上傳檔案,
每次隻能上傳一個檔案,如果需要同時上傳多個檔案,就需要運用到多線程任務來實作,可能有些地方的解釋不對,以及有一些地方浪費了資源,也就是有更好的方式,還希望路過的大佬能夠指出,謝謝大佬!!!!