小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java 網(wǎng)絡(luò)文件傳輸

 codeman 2006-09-11
關(guān)于文件傳輸?shù)膯栴},實際也是一種IO讀寫的基本問題.對于網(wǎng)絡(luò)而言也是一種IO讀寫問題.因此所謂網(wǎng)絡(luò)的文件傳輸實際是兩種IO問題的綜合討論.這里我們首先分析一個圖示.然后圍繞這個圖示來討論:
圖1:
分析圖1我們基本可以知道從服務(wù)器文件系統(tǒng)中通過流把文件中的數(shù)據(jù)寫入到服務(wù)器的進程中,然后把進程中的數(shù)據(jù)通過網(wǎng)絡(luò)IO系統(tǒng)傳遞到客戶機,這個階段,網(wǎng)絡(luò)中的數(shù)據(jù)以字節(jié)流的形式保存.當(dāng)該字節(jié)流被客戶進程接受后,客戶進程通過客戶本地文件流寫入客戶本地的文件系統(tǒng)中.
 
根據(jù)以上分析,我們基本可以確定我所需要處理的問題了.首先我們需要可以對本地文件系統(tǒng)IO操作的操作接口,然后是一個可以對網(wǎng)絡(luò)IO系統(tǒng)進行操作的操作接口,已經(jīng)一個可以把數(shù)據(jù)包裝成字節(jié)流的操作接口,他們分別可以提供客戶和服務(wù)器兩個進程進行讀寫的操作.如下圖所示:
 
圖2:
 
根據(jù)以上分析,我們可以把問題歸結(jié)到對以下編程接口的需求上:
 
1.         字節(jié)包裝器和字節(jié)解包器,
 
2.         網(wǎng)絡(luò)傳輸器和網(wǎng)絡(luò)接收器
 
3.         本地文件讀/寫器
 
 
 
而這些Java本身的API就已經(jīng)提供.他們都被包裝到j(luò)ava.io和java.net這兩個包里,這里我提供一個基于TCP/IP的實現(xiàn)版本,使用基于連接的方式來完成工作.我們首先介紹幾個相關(guān)的JDK中的類來完成以上任務(wù),
 
1.       DataOutputStream和DataInputStream實現(xiàn)類提供了上面的字節(jié)包裝和解包器的實現(xiàn)
 
2.       ServerSocket和Socekt提供了基于連接的網(wǎng)絡(luò)傳輸和接受接口
 
3.       File,FileInputStream和FileOutputStream提供了基本的本地文件輸入輸出接口.
 
 
服務(wù)器端實現(xiàn)代碼:
 
import java.io.*;
 
import java.net.*;
 
public class FileServer{
 
       public static void main(String[] args)throws Exception{
 
              //創(chuàng)建文件流用來讀取文件中的數(shù)據(jù)
 
              File file=new File("lishengjie.jpg");
 
              FileInputStream fos=new FileInputStream(file);
              
 
              //創(chuàng)建網(wǎng)絡(luò)服務(wù)器接受客戶請求
 
              ServerSocket ss=new ServerSocket(3108);
 
              Socket client=ss.accept();
              
 
              //創(chuàng)建網(wǎng)絡(luò)輸出流并提供數(shù)據(jù)包裝器
 
              OutputStream netOut=client.getOutputStream();
 
              OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));
 
              
 
              //創(chuàng)建文件讀取緩沖區(qū)
 
              byte[] buf=new byte[2048];
 
              int num=fos.read(buf);
 
              while(num!=(-1)){//是否讀完文件
 
                     doc.write(buf,0,num);//把文件數(shù)據(jù)寫出網(wǎng)絡(luò)緩沖區(qū)
 
                     doc.flush();//刷新緩沖區(qū)把數(shù)據(jù)寫往客戶端
 
                     num=fos.read(buf);//繼續(xù)從文件中讀取數(shù)據(jù)
 
              }
 
              fos.close();
 
              doc.close();
 
       }
 
}
 
 
客戶方實現(xiàn)代碼:
 
import java.io.*;
 
import java.net.*;
 
 
public class FileClient{
 
       public static void main(String[] args)throws Exception{
 
              //使用本地文件系統(tǒng)接受網(wǎng)絡(luò)數(shù)據(jù)并存為新文件
 
              File file=new File("newFile.jpg");
 
              file.createNewFile();
 
              RandomAccessFile raf=new RandomAccessFile(file,"rw");
              
 
              // 通過Socket連接文件服務(wù)器
 
              Socket server=new Socket(InetAddress.getLocalHost(),3108);
              
 
              //創(chuàng)建網(wǎng)絡(luò)接受流接受服務(wù)器文件數(shù)據(jù) 
 
              InputStream netIn=server.getInputStream();
 
              InputStream in=new DataInputStream(new BufferedInputStream(netIn));
              
 
              //創(chuàng)建緩沖區(qū)緩沖網(wǎng)絡(luò)數(shù)據(jù)
 
              byte[] buf=new byte[2048];
 
              int num=in.read(buf);              
 
              while(num!=(-1)){//是否讀完所有數(shù)據(jù)
 
                     raf.write(buf,0,num);//將數(shù)據(jù)寫往文件
 
                     raf.skipBytes(num);//順序?qū)懳募止?jié)
 
                     num=in.read(buf);//繼續(xù)從網(wǎng)絡(luò)中讀取文件
 
              }
 
              in.close();
 
              raf.close();
 
       }
 
}
歸結(jié)以上代碼:
服務(wù)器 客戶端 
1.       服務(wù)器從本地文件系統(tǒng)讀取文件
2.       服務(wù)器創(chuàng)建網(wǎng)絡(luò)服務(wù)連接
3.       服務(wù)器提供數(shù)據(jù)包裝器
4.       服務(wù)器將本地文件寫入數(shù)據(jù)包裝器
5.       服務(wù)器通過包裝器寫入到網(wǎng)絡(luò) 1.       客戶端建立新文件準備存儲來自網(wǎng)絡(luò)的數(shù)據(jù)
2.       客戶端連接服務(wù)器
3.       客戶端通過網(wǎng)絡(luò)接受服務(wù)器數(shù)據(jù)并進行數(shù)據(jù)解包
4.       客戶端將數(shù)據(jù)寫入緩沖區(qū)
5.       客戶端從緩沖區(qū)把數(shù)據(jù)寫入客戶本地文件 

 
總結(jié):
    事實上java的開發(fā)環(huán)境為我們提供大多數(shù)的編程接口,為我們簡化了開發(fā)工作量.我們通過java的IO接口所提供的文件,數(shù)據(jù)包裝器等接口非常方便的解決了我們上面的開發(fā)工作量.同時在java的net接口所提供的套接字也使得基于連接的數(shù)據(jù)接受和發(fā)送成為非常容易的工作.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多