導航:首頁 > 配伺服器 > java如何向伺服器傳輸文件

java如何向伺服器傳輸文件

發布時間:2025-03-20 23:34:12

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、文件接收工作結束

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、關閉文件,結束傳輸
*
* */

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中怎麼將一組數據從客戶端發送到伺服器端

通過反射!

下面是一個伺服器與客戶端信息交互的例子:

反射API介紹

4.Java Socket編程 TCP 協議編程
1) TCP工作模型: 先找
堂(主機/IP), 到食堂以後找窗口
(Socket/套接字 埠號), 服務員等待連接,客戶向服務員發起連接
連接以後, 一個窗口可以為每個客戶安排一個服務員(線程)提供服務,
每個服務過程可以雙向交流通訊(流), 通訊完成後要關閉連接.
5. TCP 服務端編程(食堂)(java.io.*,java.net.*,java.lang.*)
1) 創建ServerSocket實例綁定一個服務埠(Socket/套接字 埠號)
2) 開始ServerSocket實例 的監聽, 等待客戶端的連接
3) 如果有客戶連接進來, 就獲得了客戶的套接字(Socket)實例
客戶的套接字(Socket)實例中包括與客戶端建立的連接流
4) 為這個客戶(Socket) 創建一個服務線程, 提供服務(run方法)
5) 繼續等待下一個連接, 返回到2)
6) 服務線程 完成通訊服務過程

7) 埠號: 0~65535, 1K以下留給系統使用

6. TCP 客戶端編程
1) 創建Socket 實例, 連接到伺服器端, 成功創建s就表示連接到了
伺服器
Socket s = new Socket("host", port)
2) 客戶端 Socket 與伺服器端 Socket 對應, 都包含輸入, 輸出流
客戶端的s.getInputStream() 連接於伺服器s.getOutputStream()
客戶端的s.getOutputStream()連接於伺服器s.getInputStream()
3) 使用線程處理 網路流

7. Java 反射
1) 反射是Java自我管理(類, 對象)的機制
2) * 可以通過反射機制發現對象的類型 發現類型的方法/屬性/構造器
3) * Java 反射 可以創建對象 並 訪問任意對象方法和屬性等
4) Class 載入
類載入到內存: java 將磁碟類文件載入到內存中,為一個對象(實例)
這個對象是Class的實例, 也就是 這些對象都是Class實例
5)Class 實例代表Java中類型, 基本類型的類型: int.class, long.class
類類型 Class 實例獲得如下:
Class cls = String.class;
Class cls = Class.forName("java.lang.String");
Class cls = "abc".getClass();
以上方法獲得cls 是同一個對象, 就是String 類內存載入的結果

package javase2.day06.ftp;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.Scanner;/** * ftp 客戶端 可以使用命令 ls pwd get */public class FtpClient { public static void main(String[] args) throws IOException{ FtpClient client = new FtpClient(); client.open(); } public void open() throws IOException{ Socket s = new Socket("localhost", 9000); InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); //處理客戶端對伺服器的請求 new RequestProcess(out).start(); //處理伺服器的反饋信息 new ResponseProcess(in).start(); }//處理客戶端對伺服器的請求 class RequestProcess extends Thread{ OutputStream out; public RequestProcess(OutputStream out) { this.out = out; } public void run() { try{ Scanner sc = new Scanner(System.in); while(true){ String s = sc.nextLine(); IOUtils.println(out, s); if(s.equals("bye")){ System.exit(0); } } }catch(IOException e){ e.printStackTrace(); } } } class ResponseProcess extends Thread{ InputStream in; public ResponseProcess(InputStream in) { this.in = in; } public void run() { try{ while(true){ String header = IOUtils.readLine(in); if(header.startsWith("text,")){ show(header,in); }else if(header.startsWith("file,")){ save(header, in); } } }catch(IOException e){ e.printStackTrace(); } } } public void show(String header, InputStream in) throws IOException { int n = Integer.parseInt(header.split(",")[1]); for(int i=0; i<n; i++){ String s = IOUtils.readLine(in); System.out.println(s); } } public void save(String header, InputStream in) throws IOException{ File dir = new File("ftp"); if(!dir.exists()){ dir.mkdir(); } //header: file,10,filename String[] data = header.split(","); long length = Long.parseLong(data[1]); String filename = data[2]; File file = new File(dir, filename); BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(file)); for(long i=0; i<length; i++){ int b = in.read(); out.write(b); } out.close(); } }-----------------------------------package javase2.day06.ftp;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/** * 模擬FTP伺服器, 支持命令pwd,ls,get file * * 協議: type,length,value TLV格式 * * 文本: text,5\nline1\nline2\nline3\nline4\nline5\n * 文件: file,4,filename\n 41 42 43 44 * * text,5\nline1\nline2\nline3\nline4\nline5\nfile,4,filename\n 41 42 43 44 */public class FtpServer { public static void main(String[] args) throws IOException{ FtpServer server = new FtpServer(); server.start(); } public void start() throws IOException{ ServerSocket ss = new ServerSocket(9000); while(true){ Socket s = ss.accept(); new Agent(s).start(); } } class Agent extends Thread{ Socket s; public Agent(Socket s) { this.s = s; } public void run() { try{ InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); //向客戶端發送, 先發協議頭,再發送文本行 out.write("text,1\n".getBytes());//協議頭 //發送消息內容, 一行文本消息 out.write("歡迎使用FTP演示伺服器!\n".getBytes()); out.flush(); while(true){ //讀取客戶端發送到命令 String cmd = IOUtils.readLine(in).trim(); if("pwd".equals(cmd)){//顯示當前目錄 pwd(out); }else if("ls".equals(cmd)){ ls(out); }else if(cmd.startsWith("get ")){ get(cmd, out); }else if("bye".equalsIgnoreCase(cmd)){ IOUtils.println(out, "text,1"); IOUtils.println(out, "Bye, Bye!"); s.close(); }else{ out.write("text,1\n".getBytes());//協議頭 out.write("只支持pwd,ls,get,bye!\n".getBytes()); out.flush(); } } }catch(IOException e){ e.printStackTrace(); } } } public void pwd(OutputStream out) throws IOException{ File dir = new File("."); IOUtils.println(out, "text,1"); IOUtils.println(out, dir.getCanonicalPath()); } public void ls(OutputStream out) throws IOException{ File dir = new File("."); File[] files = dir.listFiles(); IOUtils.println(out, "text,"+files.length); for (File f : files) { if(f.isDirectory()){ IOUtils.println(out, "["+f.getName()+"]"); }else{ IOUtils.println(out, f.getName()); } } } public void get(String cmd, OutputStream out) throws IOException{ //cmd="get filename" String name = cmd.split("\\s+")[1]; File file = new File(name); if(! file.exists()){ IOUtils.println(out, "text,1"); IOUtils.println(out, "沒有文件呀!"+name); return; } //文件協議頭: IOUtils.println(out, "file,"+file.length()+","+name); FileInputStream in = new FileInputStream(file); IOUtils.cp(in, out); out.flush(); in.close(); IOUtils.println(out, "text,1"); IOUtils.println(out, "發送成功:"+name); }}

閱讀全文

與java如何向伺服器傳輸文件相關的資料

熱點內容
伺服器雲轉發源ip 瀏覽:29
電腦伺服器地址指的什麼 瀏覽:955
蘋果怎麼下載匯成銀行app 瀏覽:899
華為平板讀加密pdf的軟體 瀏覽:598
安卓手機電池怎麼更新 瀏覽:915
吃雞電腦版如何換伺服器 瀏覽:529
連接伺服器地址怎麼登錄 瀏覽:26
用騰訊雲搭建mc伺服器 瀏覽:585
魔獸世界gm命令坐騎 瀏覽:528
程序編譯完怎麼運行 瀏覽:795
程序員google 瀏覽:872
apache打開php文件 瀏覽:466
旗艦版打開加密服務報錯 瀏覽:140
pythonmd5模塊下載 瀏覽:953
編譯的js如何解析 瀏覽:969
視頻太大了怎麼解壓到最小 瀏覽:413
安卓十安卓十一有什麼區別 瀏覽:921
應用的緩存在哪個文件夾 瀏覽:288
怎麼在平安app里給家人保險 瀏覽:365
程序員必備十大安全工具 瀏覽:512