国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

java實(shí)現(xiàn)客戶端向服務(wù)器發(fā)送文件

2024-07-13 10:16:35
字體:
供稿:網(wǎng)友

本文實(shí)例為大家分享了java實(shí)現(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  * 實(shí)現(xiàn)功能:作為服務(wù)器接收客戶端發(fā)送的文件  *  * 具體實(shí)現(xiàn)過程:  * 1、建立SocketServer,等待客戶端的連接  * 2、當(dāng)有客戶端連接的時(shí)候,按照雙方的約定,這時(shí)要讀取一行數(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ù)器傳送文件使用,  *   每一個(gè)數(shù)據(jù)包之前沒有文件協(xié)議命令  *   具體的協(xié)議傳輸和文件傳出的使用階段可根據(jù)自己程序自行放置】  *  *  * 作者:小菜鳥  * 創(chuàng)建時(shí)間:2014-08-19  *  * */  public class ServerReceive {    public static void main(String[] args) {          /**與服務(wù)器建立連接的通信句柄*/     ServerSocket ss = null;     Socket s = null;          /**定義用于在接收后在本地創(chuàng)建的文件對(duì)象和文件輸出流對(duì)象*/     File file = null;     FileOutputStream fos = null;          /**定義輸入流,使用socket的inputStream對(duì)數(shù)據(jù)包進(jìn)行輸入*/     InputStream is = null;          /**定義byte數(shù)組來作為數(shù)據(jù)包的存儲(chǔ)數(shù)據(jù)包*/     byte[] buffer = new byte[4096 * 5];          /**用來接收文件發(fā)送請(qǐng)求的字符串*/     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ā)送過來的請(qǐng)求命令*/     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 {       /**將文件包裝到文件輸出流對(duì)象中*/       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){         /**從輸入流中讀取一個(gè)數(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  * 實(shí)現(xiàn)功能:作為客戶端向服務(wù)器發(fā)送一個(gè)文件  *  * 具體實(shí)現(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ù)器傳送文件使用,  *   每一個(gè)數(shù)據(jù)包之前沒有文件協(xié)議命令  *   具體的協(xié)議傳輸和文件傳出的使用階段可根據(jù)自己程序自行放置】  *  *  * 作者:小菜鳥  * 創(chuàng)建時(shí)間:2014-08-19  *  * */  public class ClientSend {    public static void main(String[] args) {          /**與服務(wù)器建立連接的通信句柄*/     Socket s = null;          /**定義文件對(duì)象,即為要發(fā)送的文件      * 如果使用絕對(duì)路徑,不要忘記使用'/'和'/'的區(qū)別      * 具體區(qū)別,請(qǐng)讀者自行查詢      * */     File sendfile = new File("API.CHM");     /**定義文件輸入流,用來打開、讀取即將要發(fā)送的文件*/     FileInputStream fis = null;     /**定義byte數(shù)組來作為數(shù)據(jù)包的存儲(chǔ)數(shù)據(jù)包*/     byte[] buffer = new byte[4096 * 5];          /**定義輸出流,使用socket的outputStream對(duì)數(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ù)器");     }          /**用文件對(duì)象初始化fis對(duì)象      * 以便于可以提取出文件的大小      * */     try {       fis = new FileInputStream(sendfile);     } catch (FileNotFoundException e1) {       e1.printStackTrace();     }           /**首先先向服務(wù)器發(fā)送關(guān)于文件的信息,以便于服務(wù)器進(jìn)行接收的相關(guān)準(zhǔn)備工作      * 具體的準(zhǔn)備工作,請(qǐng)查看服務(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("客戶端讀取文件出錯(cuò)");     } catch (IOException e) {       System.out.println("客戶端輸出文件出錯(cuò)");     }finally{              /**        * 將打開的文件關(guān)閉        * 如有需要,也可以在此關(guān)閉socket連接        * */       try {         if(fis != null)           fis.close();       } catch (IOException e) {         System.out.println("客戶端文件關(guān)閉出錯(cuò)");       }//catch (IOException e)     }//finally        }//public static void main(String[] args) }//public class ClientSend 

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陕西省| 瑞昌市| 海口市| 杭州市| 兴和县| 东乌珠穆沁旗| 民县| 大城县| 福鼎市| 礼泉县| 隆安县| 东兰县| 巫山县| 黄平县| 阿巴嘎旗| 麻阳| 盘锦市| 威远县| 孝昌县| 巧家县| 吴桥县| 廉江市| 界首市| 沅陵县| 台江县| 象山县| 小金县| 平湖市| 南丰县| 内乡县| 贵州省| 务川| 二连浩特市| 开阳县| 古浪县| 静宁县| 休宁县| 香格里拉县| 徐闻县| 汕头市| 玉田县|