posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java基于Socket文件傳輸示例

          Posted on 2007-10-13 09:11 詩特林 閱讀(91372) 評(píng)論(49)  編輯  收藏 所屬分類: Socket
                                                         Java基于Socket文件傳輸示例

          最近需要進(jìn)行網(wǎng)絡(luò)傳輸大文件,于是對(duì)基于socket的文件傳輸作了一個(gè)初步的了解。在一位網(wǎng)友提供的程序基礎(chǔ)上,俺進(jìn)行了一些加工,采用了緩沖輸入/輸出流來包裝輸出流,再采用數(shù)據(jù)輸入/輸出輸出流進(jìn)行包裝,加快傳輸?shù)乃俣取U話少說,先來看服務(wù)器端的程序。

          1.服務(wù)器端

          package sterning;

          import java.io.BufferedInputStream;
          import java.io.DataInputStream;
          import java.io.DataOutputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.net.ServerSocket;
          import java.net.Socket;

          public class ServerTest {
              
          int port = 8821;

              
          void start() {
                  Socket s 
          = null;
                  
          try {
                      ServerSocket ss 
          = new ServerSocket(port);
                      
          while (true{
                          
          // 選擇進(jìn)行傳輸?shù)奈募?/span>
                          String filePath = "D:\\lib.rar";
                          File fi 
          = new File(filePath);

                          System.out.println(
          "文件長度:" + (int) fi.length());

                          
          // public Socket accept() throws
                          
          // IOException偵聽并接受到此套接字的連接。此方法在進(jìn)行連接之前一直阻塞。

                          s 
          = ss.accept();
                          System.out.println(
          "建立socket鏈接");
                          DataInputStream dis 
          = new DataInputStream(new BufferedInputStream(s.getInputStream()));
                          dis.readByte();

                          DataInputStream fis 
          = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
                          DataOutputStream ps 
          = new DataOutputStream(s.getOutputStream());
                          
          //將文件名及長度傳給客戶端。這里要真正適用所有平臺(tái),例如中文名的處理,還需要加工,具體可以參見Think In Java 4th里有現(xiàn)成的代碼。
                          ps.writeUTF(fi.getName());
                          ps.flush();
                          ps.writeLong((
          long) fi.length());
                          ps.flush();

                          
          int bufferSize = 8192;
                          
          byte[] buf = new byte[bufferSize];

                          
          while (true{
                              
          int read = 0;
                              
          if (fis != null{
                                  read 
          = fis.read(buf);
                              }


                              
          if (read == -1{
                                  
          break;
                              }

                              ps.write(buf, 
          0, read);
                          }

                          ps.flush();
                          
          // 注意關(guān)閉socket鏈接哦,不然客戶端會(huì)等待server的數(shù)據(jù)過來,
                          
          // 直到socket超時(shí),導(dǎo)致數(shù)據(jù)不完整。                
                          fis.close();
                          s.close();                
                          System.out.println(
          "文件傳輸完成");
                      }


                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }


              
          public static void main(String arg[]) {
                  
          new ServerTest().start();
              }

          }


          2.socket的Util輔助類

          package sterning;

          import java.net.*;
          import java.io.*;

          public class ClientSocket {
              
          private String ip;

              
          private int port;

              
          private Socket socket = null;

              DataOutputStream out 
          = null;

              DataInputStream getMessageStream 
          = null;

              
          public ClientSocket(String ip, int port) {
                  
          this.ip = ip;
                  
          this.port = port;
              }


              
          /**
               * 創(chuàng)建socket連接
               * 
               * 
          @throws Exception
               *             exception
               
          */

              
          public void CreateConnection() throws Exception {
                  
          try {
                      socket 
          = new Socket(ip, port);
                  }
           catch (Exception e) {
                      e.printStackTrace();
                      
          if (socket != null)
                          socket.close();
                      
          throw e;
                  }
           finally {
                  }

              }


              
          public void sendMessage(String sendMessage) throws Exception {
                  
          try {
                      out 
          = new DataOutputStream(socket.getOutputStream());
                      
          if (sendMessage.equals("Windows")) {
                          out.writeByte(
          0x1);
                          out.flush();
                          
          return;
                      }

                      
          if (sendMessage.equals("Unix")) {
                          out.writeByte(
          0x2);
                          out.flush();
                          
          return;
                      }

                      
          if (sendMessage.equals("Linux")) {
                          out.writeByte(
          0x3);
                          out.flush();
                      }
           else {
                          out.writeUTF(sendMessage);
                          out.flush();
                      }

                  }
           catch (Exception e) {
                      e.printStackTrace();
                      
          if (out != null)
                          out.close();
                      
          throw e;
                  }
           finally {
                  }

              }


              
          public DataInputStream getMessageStream() throws Exception {
                  
          try {
                      getMessageStream 
          = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
                      
          return getMessageStream;
                  }
           catch (Exception e) {
                      e.printStackTrace();
                      
          if (getMessageStream != null)
                          getMessageStream.close();
                      
          throw e;
                  }
           finally {
                  }

              }


              
          public void shutDownConnection() {
                  
          try {
                      
          if (out != null)
                          out.close();
                      
          if (getMessageStream != null)
                          getMessageStream.close();
                      
          if (socket != null)
                          socket.close();
                  }
           catch (Exception e) {

                  }

              }

          }


          3.客戶端

          package sterning;

          import java.io.BufferedOutputStream;
          import java.io.DataInputStream;
          import java.io.DataOutputStream;
          import java.io.FileOutputStream;

          public class ClientTest {
              
          private ClientSocket cs = null;

              
          private String ip = "localhost";// 設(shè)置成服務(wù)器IP

              
          private int port = 8821;

              
          private String sendMessage = "Windwos";

              
          public ClientTest() {
                  
          try {
                      
          if (createConnection()) {
                          sendMessage();
                          getMessage();
                      }


                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }

              }


              
          private boolean createConnection() {
                  cs 
          = new ClientSocket(ip, port);
                  
          try {
                      cs.CreateConnection();
                      System.out.print(
          "連接服務(wù)器成功!" + "\n");
                      
          return true;
                  }
           catch (Exception e) {
                      System.out.print(
          "連接服務(wù)器失敗!" + "\n");
                      
          return false;
                  }


              }


              
          private void sendMessage() {
                  
          if (cs == null)
                      
          return;
                  
          try {
                      cs.sendMessage(sendMessage);
                  }
           catch (Exception e) {
                      System.out.print(
          "發(fā)送消息失敗!" + "\n");
                  }

              }


              
          private void getMessage() {
                  
          if (cs == null)
                      
          return;
                  DataInputStream inputStream 
          = null;
                  
          try {
                      inputStream 
          = cs.getMessageStream();
                  }
           catch (Exception e) {
                      System.out.print(
          "接收消息緩存錯(cuò)誤\n");
                      
          return;
                  }


                  
          try {
                      
          //本地保存路徑,文件名會(huì)自動(dòng)從服務(wù)器端繼承而來。
                      String savePath = "E:\\";
                      
          int bufferSize = 8192;
                      
          byte[] buf = new byte[bufferSize];
                      
          int passedlen = 0;
                      
          long len=0;
                      
                      savePath 
          += inputStream.readUTF();
                      DataOutputStream fileOut 
          = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
                      len 
          = inputStream.readLong();
                      
                      System.out.println(
          "文件的長度為:" + len + "\n");
                      System.out.println(
          "開始接收文件!" + "\n");
                              
                      
          while (true{
                          
          int read = 0;
                          
          if (inputStream != null{
                              read 
          = inputStream.read(buf);
                          }

                          passedlen 
          += read;
                          
          if (read == -1{
                              
          break;
                          }

                          
          //下面進(jìn)度條本為圖形界面的prograssBar做的,這里如果是打文件,可能會(huì)重復(fù)打印出一些相同的百分比
                          System.out.println("文件接收了" +  (passedlen * 100/ len) + "%\n");
                          fileOut.write(buf, 
          0, read);
                      }

                      System.out.println(
          "接收完成,文件存為" + savePath + "\n");

                      fileOut.close();
                  }
           catch (Exception e) {
                      System.out.println(
          "接收消息錯(cuò)誤" + "\n");
                      
          return;
                  }

              }


              
          public static void main(String arg[]) {
                  
          new ClientTest();
              }

          }

          這就實(shí)現(xiàn)了從服務(wù)器端向客戶端發(fā)送文件的過程,當(dāng)然,反過來,也一樣.稍有不同.代碼中對(duì)跨平臺(tái)的細(xì)節(jié)沒有實(shí)現(xiàn),有時(shí)間或興趣的朋友可以提供一下.

          評(píng)論

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2007-10-13 15:58 by 翔南
          最近正想試試java.net包,頂個(gè)
          回去研究研究

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2007-10-15 08:55 by 阿蜜果
          蠻不錯(cuò)的,多謝提供!

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2007-11-05 10:49 by
          很好很好!!!
          加油!!!

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2007-11-20 22:51 by witkeymap.com
          威客地圖 : http://www.witkeymap.com

          提供最新的任務(wù),威客信息檢索

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2007-11-21 00:14 by wl
          請(qǐng)問如何帶文件名并實(shí)現(xiàn)多文件一起傳輸呢?

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2007-12-27 13:32 by oak
          很好啊真希望可以學(xué)到這種程度,可以加我嗎,262874025

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-01-03 13:21 by 心雨
          很好,謝謝了,這次幫了我一個(gè)忙了
          頂起,加我QQ:527825133
          我洋特是學(xué)這個(gè)的
          、只是現(xiàn)在還在個(gè)初學(xué)者!

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2008-01-08 16:44 by tang
          能不能說下具體怎么運(yùn)行啊?

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2008-01-08 16:45 by tang
          想知道具體怎么運(yùn)行,知道的朋友麻煩說下,謝謝了!

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-01-12 13:46 by tyro729
          to:樓上
          修改好文件和保存路徑之后,先運(yùn)行服務(wù)器端,再運(yùn)行客戶端,就能在控制臺(tái)上看到輸出的進(jìn)度效果了~~去文件保存路徑看看就能看到已傳送過來的文件了

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-01-13 15:56 by wy
          exception in thread'main' java.lang.NoclassDefFoundError...怎么回事?javac正確,java時(shí)有問題

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-02-22 22:58 by Leshy
          應(yīng)該你執(zhí)行的時(shí)候有問題吧。。。

          cmd 到保存的目錄,執(zhí)行以下命令
          javac -d . *.java
          java sterning.ServerTest
          java sterning.ClientTest

          看不明白,看書上關(guān)于包一章的內(nèi)容。。。

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2008-03-25 16:06 by richard
          very good!

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-04-16 08:24 by wingzwf
          很不錯(cuò),正在學(xué)習(xí)中,謝謝博主你的知識(shí)讓我佩服,

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-06-09 21:39 by XL
          太謝謝了

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-07-01 18:33 by 小女子
          樓主:很愛很愛你!!

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-07-01 18:35 by 小女子
          到處都找不到,就在我絕望的邊緣,我發(fā)現(xiàn)了你的share doc

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-09-01 17:26 by hjg515
          大文件傳送,大照片發(fā)送,跨國文件傳送,跨國文件傳輸,網(wǎng)絡(luò)傳輸加速,跨國網(wǎng)絡(luò)傳輸,都是酷達(dá)的代名詞。
          酷達(dá)軟件科技有限公司,長期以來致力于互聯(lián)網(wǎng)數(shù)據(jù)傳輸加速的研究,在互聯(lián)網(wǎng)數(shù)據(jù)傳輸加速方面處于全球領(lǐng)先地位。公司已經(jīng)為眾多的跨國企業(yè)提供大數(shù)據(jù)傳輸服務(wù)。公司擁有一批硅谷歸來的研發(fā)精英,在網(wǎng)絡(luò)傳輸加速方面積累了大量的技術(shù)創(chuàng)新;2007年10月,公司研發(fā)團(tuán)隊(duì)重拳出擊,在Qoodaa0.08中加入了自主創(chuàng)新的MNP2P技術(shù),在跨國傳輸方面取得了革命性的進(jìn)展,把競(jìng)爭(zhēng)對(duì)手遠(yuǎn)遠(yuǎn)地拋到了身后。擁有酷達(dá)傳輸,信息暢游天下。酷達(dá)流暢的界面,簡單的操作,清新的風(fēng)格,超越極限的傳輸速度,最終奠定了酷達(dá)在互聯(lián)網(wǎng)大文件傳輸行業(yè)的霸主地位。公司在前進(jìn)的過程中經(jīng)歷了許多的坎坷和荊棘,但是,廣大用戶對(duì)我們的支持和肯定最終讓我們克服了艱難險(xiǎn)阻,Qoodaa0.08產(chǎn)品得到了廣大用戶的一致好評(píng)。我們的研發(fā)團(tuán)隊(duì)將一如既往,從穩(wěn)定性、安全性,傳輸效率等多方面進(jìn)行改進(jìn),幫助更多的企業(yè)和個(gè)人把信息傳輸?shù)绞澜绺鞯亍>W(wǎng)址:http://www.qoodaa.com.cn


          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2008-09-02 18:14 by hjg515
          大文件傳送,大照片發(fā)送,跨國文件傳送,跨國文件傳輸,網(wǎng)絡(luò)傳輸加速,跨國網(wǎng)絡(luò)傳輸,都是酷達(dá)的代名詞。建議你使用酷達(dá)免費(fèi)軟件,這種軟件專門用來傳輸大文件的,我用了,速度非常快!在http://www.qoodaa.com.cn可以下載到

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2008-09-18 09:24 by 文濤
          我在測(cè)試的時(shí)候發(fā)現(xiàn)客戶端顯示的文件接收百分比為負(fù)的,看了半天也沒看出是什么原因。

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2008-09-18 16:45 by 文濤
          我已經(jīng)知道百分比不正常顯示的原因了,將程序中下面這一句:
          System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n");
          改為:
          System.out.println("文件接收了" + (passedlen * 100L/ len) + "%\n");
          就可以了。
          數(shù)據(jù)太大整形數(shù)據(jù)原因。

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-02-15 21:40 by Kioe
          精彩·~~我近來在寫UDP傳輸大文件

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-02-27 10:10 by hello
          謝謝摟主

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2009-04-09 11:53 by jack
          你好,我想問一下,為什么savePath += inputStream.readUTF();這句里的inputStream.readUTF()就是文件名呢。謝謝。我的email:jack60508065@sohu.com

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-04-09 20:24 by 老蘭
          不錯(cuò),學(xué)習(xí)

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-05-26 16:12 by 抱不平
          博主,有培訓(xùn)公司將你以上代碼所為商業(yè)用途,而且不加以說明。公司所在地安徽合肥。不知道博主是否在安徽供職過。。
          實(shí)時(shí)關(guān)注。

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-06-22 08:42 by xiaochengluoye
          謝謝樓主,幫了我一大忙。

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2009-07-02 16:16 by 小嘴
          看不懂 但是上面都說好 我也說好 謝謝

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2009-11-28 23:02 by JAVA fans
          太棒了!!!!真是好東東..

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2010-04-09 17:31 by 單聲道
          更詳細(xì)的可以到 http://www.jianfei5u.com 查看

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2010-06-04 12:16 by realfex
          很酷,感謝樓主。

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2010-11-23 14:35 by 楊軍
          @翔南
          不錯(cuò),簡潔明了

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2011-06-03 18:52 by jeny
          你好,請(qǐng)問如果 只是通過java服務(wù)器轉(zhuǎn)發(fā)文件數(shù)據(jù) 是否必須用 FileInputStream和FileOutputStream接收或發(fā)送 文件數(shù)據(jù)流呢?

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2011-06-30 18:32 by 超群
          運(yùn)行有怎么又異常。。。怎么辦的啊

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2011-11-08 21:08 by 好奇寶寶
          學(xué)習(xí)中~~感謝~

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2011-11-26 19:23 by x
          先謝了

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2012-04-10 11:13 by Davy Lee
          謝謝LZ分享

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2012-10-19 22:11 by chloe
          多謝樓主,幫了大忙了。用在項(xiàng)目里,速度快了不少。

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2012-10-20 12:05 by 王亞楠
          現(xiàn)在學(xué)習(xí)java一年了,感覺有點(diǎn)迷茫,看到您的博客是從07年就開始,那時(shí)候俺還上高中呢,希望能得到您職業(yè)上面的指導(dǎo),謝謝啦。 俺qq:1239806145,再次謝謝啦。。。

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2013-04-19 16:08 by 魏國正
          我想問 為什么老是 系統(tǒng)找不到指定文件啊 我改好了文件名和路徑

          # re: Java基于Socket文件傳輸示例[未登錄]  回復(fù)  更多評(píng)論   

          2013-09-05 06:53 by javac
          注釋太少了啊,閱讀起來吃力啊

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2013-10-07 17:06 by widekuan
          大文件傳輸?shù)男Ч菜撇皇呛芎冒伞!!?/div>

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2014-04-17 13:47 by 美景
          連接服務(wù)器成功!
          接收消息錯(cuò)誤
          這個(gè)提示是什么意思?哪里出錯(cuò)誤了,麻煩您了

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2014-11-05 17:53 by afd
          不錯(cuò)

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2014-11-05 17:53 by afd
          不錯(cuò) 有用

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2015-03-31 17:21 by 1323
          樓主 請(qǐng)問如果要加個(gè)界面該怎么加

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2015-12-03 11:51 by 小浩浩
          多謝樓主

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2016-04-13 16:19 by 無味
          我也是
          連接服務(wù)器成功!
          接收消息錯(cuò)誤

          怎樣彈出界面啊

          # re: Java基于Socket文件傳輸示例  回復(fù)  更多評(píng)論   

          2016-05-20 11:30 by tjh
          @tang
          @無味
          加div 彈出層
          主站蜘蛛池模板: 大新县| 安乡县| 新和县| 镇赉县| 左权县| 古丈县| 锡林浩特市| 乌拉特后旗| 黄梅县| 都匀市| 阿拉尔市| 彰武县| 清丰县| 信阳市| 黄石市| 襄樊市| 闽清县| 进贤县| 珲春市| 杭州市| 卓资县| 宝坻区| 白朗县| 田林县| 盖州市| 昂仁县| 吉安市| 乌鲁木齐市| 绥德县| 仪征市| 彭水| 德州市| 佛学| 南丰县| 井陉县| 大城县| 明溪县| 广宁县| 万州区| 金塔县| 和政县|