2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

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

 yetao_study 2015-12-02

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

作者: 何雙江

 

關(guān)鍵字: Java  何雙江  IO  NET  File

 

讀者范圍:

本文是一篇簡(jiǎn)短入門(mén)文章.本文假設(shè)讀者對(duì)JavaIO系統(tǒng)和Java的網(wǎng)絡(luò)系統(tǒng)有所了解.

 

正文:

關(guān)于文件傳輸?shù)膯?wèn)題,實(shí)際也是一種IO讀寫(xiě)的基本問(wèn)題.對(duì)于網(wǎng)絡(luò)而言也是一種IO讀寫(xiě)問(wèn)題.因此所謂網(wǎng)絡(luò)的文件傳輸實(shí)際是兩種IO問(wèn)題的綜合討論.這里我們首先分析一個(gè)圖示.然后圍繞這個(gè)圖示來(lái)討論:

 

 

1:

分析圖1我們基本可以知道從服務(wù)器文件系統(tǒng)中通過(guò)流把文件中的數(shù)據(jù)寫(xiě)入到服務(wù)器的進(jìn)程中,然后把進(jìn)程中的數(shù)據(jù)通過(guò)網(wǎng)絡(luò)IO系統(tǒng)傳遞到客戶(hù)機(jī),這個(gè)階段,網(wǎng)絡(luò)中的數(shù)據(jù)以字節(jié)流的形式保存.當(dāng)該字節(jié)流被客戶(hù)進(jìn)程接受后,客戶(hù)進(jìn)程通過(guò)客戶(hù)本地文件流寫(xiě)入客戶(hù)本地的文件系統(tǒng)中.

 

根據(jù)以上分析,我們基本可以確定我所需要處理的問(wèn)題了.首先我們需要可以對(duì)本地文件系統(tǒng)IO操作的操作接口,然后是一個(gè)可以對(duì)網(wǎng)絡(luò)IO系統(tǒng)進(jìn)行操作的操作接口,已經(jīng)一個(gè)可以把數(shù)據(jù)包裝成字節(jié)流的操作接口,他們分別可以提供客戶(hù)和服務(wù)器兩個(gè)進(jìn)程進(jìn)行讀寫(xiě)的操作.如下圖所示:



2:

根據(jù)以上分析,我們可以把問(wèn)題歸結(jié)到對(duì)以下編程接口的需求上:

1.         字節(jié)包裝器和字節(jié)解包器,

2.         網(wǎng)絡(luò)傳輸器和網(wǎng)絡(luò)接收器

3.         本地文件讀/寫(xiě)器

 

而這些Java本身的API就已經(jīng)提供.他們都被包裝到java.iojava.net這兩個(gè)包里,這里我提供一個(gè)基于TCP/IP的實(shí)現(xiàn)版本,使用基于連接的方式來(lái)完成工作.我們首先介紹幾個(gè)相關(guān)的JDK中的類(lèi)來(lái)完成以上任務(wù),

1.       DataOutputStreamDataInputStream實(shí)現(xiàn)類(lèi)提供了上面的字節(jié)包裝和解包器的實(shí)現(xiàn)

2.       ServerSocketSocekt提供了基于連接的網(wǎng)絡(luò)傳輸和接受接口

3.       File,FileInputStreamFileOutputStream提供了基本的本地文件輸入輸出接口.

 

 

服務(wù)器端實(shí)現(xiàn)代碼:

import java.io.*;

import java.net.*;

 

public class FileServer{

       public static void main(String[] args)throws Exception{

              //創(chuàng)建文件流用來(lái)讀取文件中的數(shù)據(jù)

              File file=new File("lishengjie.jpg");

              FileInputStream fos=new FileInputStream(file);

             

              //創(chuàng)建網(wǎng)絡(luò)服務(wù)器接受客戶(hù)請(qǐng)求

              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ù)寫(xiě)出網(wǎng)絡(luò)緩沖區(qū)

                     doc.flush();//刷新緩沖區(qū)把數(shù)據(jù)寫(xiě)往客戶(hù)端

                     num=fos.read(buf);//繼續(xù)從文件中讀取數(shù)據(jù)

              }

              fos.close();

              doc.close();

       }

}

 

客戶(hù)方實(shí)現(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");

             

              // 通過(guò)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ù)寫(xiě)往文件

                     raf.skipBytes(num);//順序?qū)懳募止?jié)

                     num=in.read(buf);//繼續(xù)從網(wǎng)絡(luò)中讀取文件

              }

              in.close();

              raf.close();

       }

}

歸結(jié)以上代碼:

服務(wù)器

客戶(hù)端

1.       服務(wù)器從本地文件系統(tǒng)讀取文件

2.       服務(wù)器創(chuàng)建網(wǎng)絡(luò)服務(wù)連接

3.       服務(wù)器提供數(shù)據(jù)包裝器

4.       服務(wù)器將本地文件寫(xiě)入數(shù)據(jù)包裝器

5.       服務(wù)器通過(guò)包裝器寫(xiě)入到網(wǎng)絡(luò)

1.       客戶(hù)端建立新文件準(zhǔn)備存儲(chǔ)來(lái)自網(wǎng)絡(luò)的數(shù)據(jù)

2.       客戶(hù)端連接服務(wù)器

3.       客戶(hù)端通過(guò)網(wǎng)絡(luò)接受服務(wù)器數(shù)據(jù)并進(jìn)行數(shù)據(jù)解包

4.       客戶(hù)端將數(shù)據(jù)寫(xiě)入緩沖區(qū)

5.       客戶(hù)端從緩沖區(qū)把數(shù)據(jù)寫(xiě)入客戶(hù)本地文件

 

總結(jié):

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多