java實現(xiàn)客戶端向服務(wù)器發(fā)送文件
更新時間:2018年01月13日 12:20:48 作者:殘舞亂步
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)客戶端向服務(wù)器發(fā)送文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了java實現(xiàn)客戶端向服務(wù)器發(fā)送文件的具體代碼,供大家參考,具體內(nèi)容如下
服務(wù)器源代碼:
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 * 實現(xiàn)功能:作為服務(wù)器接收客戶端發(fā)送的文件 * * 具體實現(xiàn)過程: * 1、建立SocketServer,等待客戶端的連接 * 2、當(dāng)有客戶端連接的時候,按照雙方的約定,這時要讀取一行數(shù)據(jù) * 其中保存客戶端要發(fā)送的文件名和文件大小信息 * 3、根據(jù)文件名在本地創(chuàng)建文件,并建立好流通信 * 4、循環(huán)接收數(shù)據(jù)包,將數(shù)據(jù)包寫入文件 * 5、當(dāng)接收數(shù)據(jù)的長度等于提前文件發(fā)過來的文件長度,即表示文件接收完畢,關(guān)閉文件 * 6、文件接收工作結(jié)束 * * * 【注:此代碼僅為演示客戶端與服務(wù)器傳送文件使用, * 每一個數(shù)據(jù)包之前沒有文件協(xié)議命令 * 具體的協(xié)議傳輸和文件傳出的使用階段可根據(jù)自己程序自行放置】 * * * 作者:小菜鳥 * 創(chuàng)建時間:2014-08-19 * * */ public class ServerReceive { public static void main(String[] args) { /**與服務(wù)器建立連接的通信句柄*/ ServerSocket ss = null; Socket s = null; /**定義用于在接收后在本地創(chuàng)建的文件對象和文件輸出流對象*/ File file = null; FileOutputStream fos = null; /**定義輸入流,使用socket的inputStream對數(shù)據(jù)包進(jìn)行輸入*/ InputStream is = null; /**定義byte數(shù)組來作為數(shù)據(jù)包的存儲數(shù)據(jù)包*/ byte[] buffer = new byte[4096 * 5]; /**用來接收文件發(fā)送請求的字符串*/ String comm = null; /**建立socekt通信,等待服務(wù)器進(jìn)行連接*/ try { ss = new ServerSocket(4004); s = ss.accept(); } catch (IOException e) { e.printStackTrace(); } /**讀取一行客戶端發(fā)送過來的約定信息*/ try { InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); comm = br.readLine(); } catch (IOException e) { System.out.println("服務(wù)器與客戶端斷開連接"); } /**開始解析客戶端發(fā)送過來的請求命令*/ int index = comm.indexOf("/#"); /**判斷協(xié)議是否為發(fā)送文件的協(xié)議*/ String xieyi = comm.substring(0, index); if(!xieyi.equals("111")){ System.out.println("服務(wù)器收到的協(xié)議碼不正確"); return; } /**解析出文件的名字和大小*/ comm = comm.substring(index + 2); index = comm.indexOf("/#"); String filename = comm.substring(0, index).trim(); String filesize = comm.substring(index + 2).trim(); /**創(chuàng)建空文件,用來進(jìn)行接收文件*/ file = new File(filename); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System.out.println("服務(wù)器端創(chuàng)建文件失敗"); } }else{ /**在此也可以詢問是否覆蓋*/ System.out.println("本路徑已存在相同文件,進(jìn)行覆蓋"); } /**【以上就是客戶端代碼中寫到的服務(wù)器的準(zhǔn)備部分】*/ /** * 服務(wù)器接收文件的關(guān)鍵代碼*/ try { /**將文件包裝到文件輸出流對象中*/ fos = new FileOutputStream(file); long file_size = Long.parseLong(filesize); is = s.getInputStream(); /**size為每次接收數(shù)據(jù)包的長度*/ int size = 0; /**count用來記錄已接收到文件的長度*/ long count = 0; /**使用while循環(huán)接收數(shù)據(jù)包*/ while(count < file_size){ /**從輸入流中讀取一個數(shù)據(jù)包*/ size = is.read(buffer); /**將剛剛讀取的數(shù)據(jù)包寫到本地文件中去*/ fos.write(buffer, 0, size); fos.flush(); /**將已接收到文件的長度+size*/ count += size; System.out.println("服務(wù)器端接收到數(shù)據(jù)包,大小為" + size); } } catch (FileNotFoundException e) { System.out.println("服務(wù)器寫文件失敗"); } catch (IOException e) { System.out.println("服務(wù)器:客戶端斷開連接"); }finally{ /** * 將打開的文件關(guān)閉 * 如有需要,也可以在此關(guān)閉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 * 實現(xiàn)功能:作為客戶端向服務(wù)器發(fā)送一個文件 * * 具體實現(xiàn)過程: * 1、建立與服務(wù)器端的連接,IP:127.0.0.1, port:4004 * 2、將文件的名字和大小通過自定義的文件傳輸協(xié)議,發(fā)送到服務(wù)器 * 3、循環(huán)讀取本地文件,將文件打包發(fā)送到數(shù)據(jù)輸出流中 * 4、關(guān)閉文件,結(jié)束傳輸 * * 【注:此代碼僅為演示客戶端與服務(wù)器傳送文件使用, * 每一個數(shù)據(jù)包之前沒有文件協(xié)議命令 * 具體的協(xié)議傳輸和文件傳出的使用階段可根據(jù)自己程序自行放置】 * * * 作者:小菜鳥 * 創(chuàng)建時間:2014-08-19 * * */ public class ClientSend { public static void main(String[] args) { /**與服務(wù)器建立連接的通信句柄*/ Socket s = null; /**定義文件對象,即為要發(fā)送的文件 * 如果使用絕對路徑,不要忘記使用'/'和'\'的區(qū)別 * 具體區(qū)別,請讀者自行查詢 * */ File sendfile = new File("API.CHM"); /**定義文件輸入流,用來打開、讀取即將要發(fā)送的文件*/ FileInputStream fis = null; /**定義byte數(shù)組來作為數(shù)據(jù)包的存儲數(shù)據(jù)包*/ byte[] buffer = new byte[4096 * 5]; /**定義輸出流,使用socket的outputStream對數(shù)據(jù)包進(jìn)行輸出*/ OutputStream os = null; /**檢查要發(fā)送的文件是否存在*/ if(!sendfile.exists()){ System.out.println("客戶端:要發(fā)送的文件不存在"); return; } /**與服務(wù)器建立連接*/ try { s = new Socket("127.0.0.1", 4004); }catch (IOException e) { System.out.println("未連接到服務(wù)器"); } /**用文件對象初始化fis對象 * 以便于可以提取出文件的大小 * */ try { fis = new FileInputStream(sendfile); } catch (FileNotFoundException e1) { e1.printStackTrace(); } /**首先先向服務(wù)器發(fā)送關(guān)于文件的信息,以便于服務(wù)器進(jìn)行接收的相關(guān)準(zhǔn)備工作 * 具體的準(zhǔn)備工作,請查看服務(wù)器代碼。 * * 發(fā)送的內(nèi)容包括:發(fā)送文件協(xié)議碼(此處為111)/#文件名(帶后綴名)/#文件大小 * */ try { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println("111/#" + sendfile.getName() + "/#" + fis.available()); ps.flush(); } catch (IOException e) { System.out.println("服務(wù)器連接中斷"); } /** * 此處睡眠2s,等待服務(wù)器把相關(guān)的工作準(zhǔn)備好 * 也是為了保證網(wǎng)絡(luò)的延遲 * 讀者可自行選擇添加此代碼 * */ try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } /**之前的準(zhǔn)備工作結(jié)束之后 * 下面就是文件傳輸?shù)年P(guān)鍵代碼 * */ try { /**獲取socket的OutputStream,以便向其中寫入數(shù)據(jù)包*/ os = s.getOutputStream(); /** size 用來記錄每次讀取文件的大小*/ int size = 0; /**使用while循環(huán)讀取文件,直到文件讀取結(jié)束*/ while((size = fis.read(buffer)) != -1){ System.out.println("客戶端發(fā)送數(shù)據(jù)包,大小為" + size); /**向輸出流中寫入剛剛讀到的數(shù)據(jù)包*/ os.write(buffer, 0, size); /**刷新一下*/ os.flush(); } } catch (FileNotFoundException e) { System.out.println("客戶端讀取文件出錯"); } catch (IOException e) { System.out.println("客戶端輸出文件出錯"); }finally{ /** * 將打開的文件關(guān)閉 * 如有需要,也可以在此關(guān)閉socket連接 * */ try { if(fis != null) fis.close(); } catch (IOException e) { System.out.println("客戶端文件關(guān)閉出錯"); }//catch (IOException e) }//finally }//public static void main(String[] args) }//public class ClientSend
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Vue+Java 通過websocket實現(xiàn)服務(wù)器與客戶端雙向通信操作
- Java利用TCP協(xié)議實現(xiàn)客戶端與服務(wù)器通信(附通信源碼)
- Java實現(xiàn)UDP通信過程實例分析【服務(wù)器端與客戶端】
- java UDP通信客戶端與服務(wù)器端實例分析
- java Tcp通信客戶端與服務(wù)器端實例
- java模擬TCP通信實現(xiàn)客戶端上傳文件到服務(wù)器端
- java模擬客戶端向服務(wù)器上傳文件
- Java實現(xiàn)文件上傳服務(wù)器和客戶端
- java實現(xiàn)上傳文件到服務(wù)器和客戶端
- Java Socket編程服務(wù)器響應(yīng)客戶端實例代碼
- Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼
- java多線程實現(xiàn)服務(wù)器端與多客戶端之間的通信
- 教你怎么用java實現(xiàn)客戶端與服務(wù)器一問一答
相關(guān)文章
詳解Spring Boot 項目啟動時執(zhí)行特定方法
這篇文章主要介紹了詳解Spring Boot 項目啟動時執(zhí)行特定方法,Springboot給我們提供了兩種“開機(jī)啟動”某些方法的方式:ApplicationRunner和CommandLineRunner。感興趣的小伙伴們可以參考一下2018-06-06淺談SpringBoot 中關(guān)于自定義異常處理的套路
這篇文章主要介紹了淺談SpringBoot 中關(guān)于自定義異常處理的套路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java數(shù)據(jù)結(jié)構(gòu)之順序表篇
順序表,全名順序存儲結(jié)構(gòu),是線性表的一種。線性表用于存儲邏輯關(guān)系為“一對一”的數(shù)據(jù),順序表自然也不例外,不僅如此,順序表對數(shù)據(jù)物理存儲結(jié)構(gòu)也有要求。順序表存儲數(shù)據(jù)時,會提前申請一整塊足夠大小的物理空間,然后將數(shù)據(jù)依次存儲起來,存儲時數(shù)據(jù)元素間不留縫隙2022-01-01SpringBoot靜態(tài)資源與首頁配置實現(xiàn)原理深入分析
最近在做SpringBoot項目的時候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10