您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)java實現(xiàn)客戶端向服務(wù)器發(fā)送文件的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
=具體內(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
感謝各位的閱讀!關(guān)于“java實現(xiàn)客戶端向服務(wù)器發(fā)送文件”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。