您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關java實現客戶端向服務器發送文件的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
=具體內容如下
服務器源代碼:
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * * 文件名:ServerReceive.java * 實現功能:作為服務器接收客戶端發送的文件 * * 具體實現過程: * 1、建立SocketServer,等待客戶端的連接 * 2、當有客戶端連接的時候,按照雙方的約定,這時要讀取一行數據 * 其中保存客戶端要發送的文件名和文件大小信息 * 3、根據文件名在本地創建文件,并建立好流通信 * 4、循環接收數據包,將數據包寫入文件 * 5、當接收數據的長度等于提前文件發過來的文件長度,即表示文件接收完畢,關閉文件 * 6、文件接收工作結束 * * * 【注:此代碼僅為演示客戶端與服務器傳送文件使用, * 每一個數據包之前沒有文件協議命令 * 具體的協議傳輸和文件傳出的使用階段可根據自己程序自行放置】 * * * 作者:小菜鳥 * 創建時間:2014-08-19 * * */ public class ServerReceive { public static void main(String[] args) { /**與服務器建立連接的通信句柄*/ ServerSocket ss = null; Socket s = null; /**定義用于在接收后在本地創建的文件對象和文件輸出流對象*/ File file = null; FileOutputStream fos = null; /**定義輸入流,使用socket的inputStream對數據包進行輸入*/ InputStream is = null; /**定義byte數組來作為數據包的存儲數據包*/ byte[] buffer = new byte[4096 * 5]; /**用來接收文件發送請求的字符串*/ String comm = null; /**建立socekt通信,等待服務器進行連接*/ try { ss = new ServerSocket(4004); s = ss.accept(); } catch (IOException e) { e.printStackTrace(); } /**讀取一行客戶端發送過來的約定信息*/ try { InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); comm = br.readLine(); } catch (IOException e) { System.out.println("服務器與客戶端斷開連接"); } /**開始解析客戶端發送過來的請求命令*/ int index = comm.indexOf("/#"); /**判斷協議是否為發送文件的協議*/ String xieyi = comm.substring(0, index); if(!xieyi.equals("111")){ System.out.println("服務器收到的協議碼不正確"); return; } /**解析出文件的名字和大小*/ comm = comm.substring(index + 2); index = comm.indexOf("/#"); String filename = comm.substring(0, index).trim(); String filesize = comm.substring(index + 2).trim(); /**創建空文件,用來進行接收文件*/ file = new File(filename); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System.out.println("服務器端創建文件失敗"); } }else{ /**在此也可以詢問是否覆蓋*/ System.out.println("本路徑已存在相同文件,進行覆蓋"); } /**【以上就是客戶端代碼中寫到的服務器的準備部分】*/ /** * 服務器接收文件的關鍵代碼*/ try { /**將文件包裝到文件輸出流對象中*/ fos = new FileOutputStream(file); long file_size = Long.parseLong(filesize); is = s.getInputStream(); /**size為每次接收數據包的長度*/ int size = 0; /**count用來記錄已接收到文件的長度*/ long count = 0; /**使用while循環接收數據包*/ while(count < file_size){ /**從輸入流中讀取一個數據包*/ size = is.read(buffer); /**將剛剛讀取的數據包寫到本地文件中去*/ fos.write(buffer, 0, size); fos.flush(); /**將已接收到文件的長度+size*/ count += size; System.out.println("服務器端接收到數據包,大小為" + size); } } catch (FileNotFoundException e) { System.out.println("服務器寫文件失敗"); } catch (IOException e) { System.out.println("服務器:客戶端斷開連接"); }finally{ /** * 將打開的文件關閉 * 如有需要,也可以在此關閉socket連接 * */ try { if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); }//catch (IOException e) }//finally }//public static void main(String[] args) }//public class ServerReceive
客戶端源代碼:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; /** * * 文件名:ClientSend.java * 實現功能:作為客戶端向服務器發送一個文件 * * 具體實現過程: * 1、建立與服務器端的連接,IP:127.0.0.1, port:4004 * 2、將文件的名字和大小通過自定義的文件傳輸協議,發送到服務器 * 3、循環讀取本地文件,將文件打包發送到數據輸出流中 * 4、關閉文件,結束傳輸 * * 【注:此代碼僅為演示客戶端與服務器傳送文件使用, * 每一個數據包之前沒有文件協議命令 * 具體的協議傳輸和文件傳出的使用階段可根據自己程序自行放置】 * * * 作者:小菜鳥 * 創建時間:2014-08-19 * * */ public class ClientSend { public static void main(String[] args) { /**與服務器建立連接的通信句柄*/ Socket s = null; /**定義文件對象,即為要發送的文件 * 如果使用絕對路徑,不要忘記使用'/'和'\'的區別 * 具體區別,請讀者自行查詢 * */ File sendfile = new File("API.CHM"); /**定義文件輸入流,用來打開、讀取即將要發送的文件*/ FileInputStream fis = null; /**定義byte數組來作為數據包的存儲數據包*/ byte[] buffer = new byte[4096 * 5]; /**定義輸出流,使用socket的outputStream對數據包進行輸出*/ OutputStream os = null; /**檢查要發送的文件是否存在*/ if(!sendfile.exists()){ System.out.println("客戶端:要發送的文件不存在"); return; } /**與服務器建立連接*/ try { s = new Socket("127.0.0.1", 4004); }catch (IOException e) { System.out.println("未連接到服務器"); } /**用文件對象初始化fis對象 * 以便于可以提取出文件的大小 * */ try { fis = new FileInputStream(sendfile); } catch (FileNotFoundException e1) { e1.printStackTrace(); } /**首先先向服務器發送關于文件的信息,以便于服務器進行接收的相關準備工作 * 具體的準備工作,請查看服務器代碼。 * * 發送的內容包括:發送文件協議碼(此處為111)/#文件名(帶后綴名)/#文件大小 * */ try { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println("111/#" + sendfile.getName() + "/#" + fis.available()); ps.flush(); } catch (IOException e) { System.out.println("服務器連接中斷"); } /** * 此處睡眠2s,等待服務器把相關的工作準備好 * 也是為了保證網絡的延遲 * 讀者可自行選擇添加此代碼 * */ try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } /**之前的準備工作結束之后 * 下面就是文件傳輸的關鍵代碼 * */ try { /**獲取socket的OutputStream,以便向其中寫入數據包*/ os = s.getOutputStream(); /** size 用來記錄每次讀取文件的大小*/ int size = 0; /**使用while循環讀取文件,直到文件讀取結束*/ while((size = fis.read(buffer)) != -1){ System.out.println("客戶端發送數據包,大小為" + size); /**向輸出流中寫入剛剛讀到的數據包*/ os.write(buffer, 0, size); /**刷新一下*/ os.flush(); } } catch (FileNotFoundException e) { System.out.println("客戶端讀取文件出錯"); } catch (IOException e) { System.out.println("客戶端輸出文件出錯"); }finally{ /** * 將打開的文件關閉 * 如有需要,也可以在此關閉socket連接 * */ try { if(fis != null) fis.close(); } catch (IOException e) { System.out.println("客戶端文件關閉出錯"); }//catch (IOException e) }//finally }//public static void main(String[] args) }//public class ClientSend
感謝各位的閱讀!關于“java實現客戶端向服務器發送文件”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。