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

