javaboys

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

          ?

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

          讀者范圍:

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

          正文:

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

          1:

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

          ?

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

          ?

          2:

          ?

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

          ?

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

          ?

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

          ?

          3. ????????本地文件讀/寫器

          ?

          ?

          ?

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

          ?

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

          ?

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

          ?

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

          ?

          ?

          ?

          ?

          ?

          服務(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.?????? 客戶端建立新文件準(zhǔn)備存儲來自網(wǎng)絡(luò)的數(shù)據(jù)

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

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

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

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

          ?

          總結(jié):

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

          ?



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=283322


          posted on 2007-04-01 18:19 javaboys 閱讀(162) 評論(0)  編輯  收藏 所屬分類: j2se


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 密山市| 都昌县| 方城县| 宁武县| 康定县| 延长县| 健康| 开远市| 米泉市| 安泽县| 高邮市| 封丘县| 肇庆市| 泸水县| 安溪县| 邓州市| 新干县| 兰西县| 厦门市| 利辛县| 高清| 仁布县| 禄丰县| 十堰市| 乐昌市| 丹江口市| 方城县| 台北县| 田林县| 淮滨县| 新余市| 武山县| 陕西省| 东阳市| 米易县| 彭水| 河津市| 广丰县| 象州县| 安塞县| 嘉峪关市|