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

          Java基于Socket文件傳輸示例

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

          最近需要進行網絡傳輸大文件,于是對基于socket的文件傳輸作了一個初步的了解。在一位網友提供的程序基礎上,俺進行了一些加工,采用了緩沖輸入/輸出流來包裝輸出流,再采用數據輸入/輸出輸出流進行包裝,加快傳輸的速度。廢話少說,先來看服務器端的程序。

          1.服務器端

          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{
                          
          // 選擇進行傳輸的文件
                          String filePath = "D:\\lib.rar";
                          File fi 
          = new File(filePath);

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

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

                          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());
                          
          //將文件名及長度傳給客戶端。這里要真正適用所有平臺,例如中文名的處理,還需要加工,具體可以參見Think In Java 4th里有現成的代碼。
                          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();
                          
          // 注意關閉socket鏈接哦,不然客戶端會等待server的數據過來,
                          
          // 直到socket超時,導致數據不完整。                
                          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;
              }


              
          /**
               * 創建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";// 設置成服務器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(
          "連接服務器成功!" + "\n");
                      
          return true;
                  }
           catch (Exception e) {
                      System.out.print(
          "連接服務器失敗!" + "\n");
                      
          return false;
                  }


              }


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

              }


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


                  
          try {
                      
          //本地保存路徑,文件名會自動從服務器端繼承而來。
                      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;
                          }

                          
          //下面進度條本為圖形界面的prograssBar做的,這里如果是打文件,可能會重復打印出一些相同的百分比
                          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(
          "接收消息錯誤" + "\n");
                      
          return;
                  }

              }


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

          }

          這就實現了從服務器端向客戶端發送文件的過程,當然,反過來,也一樣.稍有不同.代碼中對跨平臺的細節沒有實現,有時間或興趣的朋友可以提供一下.

          評論

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          提供最新的任務,威客信息檢索

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2007-11-21 00:14 by wl
          請問如何帶文件名并實現多文件一起傳輸呢?

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2008-02-22 22:58 by Leshy
          應該你執行的時候有問題吧。。。

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

          看不明白,看書上關于包一章的內容。。。

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2008-04-16 08:24 by wingzwf
          很不錯,正在學習中,謝謝博主你的知識讓我佩服,

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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


          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

          2008-09-18 09:24 by 文濤
          我在測試的時候發現客戶端顯示的文件接收百分比為負的,看了半天也沒看出是什么原因。

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2009-04-09 20:24 by 老蘭
          不錯,學習

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2011-06-03 18:52 by jeny
          你好,請問如果 只是通過java服務器轉發文件數據 是否必須用 FileInputStream和FileOutputStream接收或發送 文件數據流呢?

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2011-11-08 21:08 by 好奇寶寶
          學習中~~感謝~

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2012-10-20 12:05 by 王亞楠
          現在學習java一年了,感覺有點迷茫,看到您的博客是從07年就開始,那時候俺還上高中呢,希望能得到您職業上面的指導,謝謝啦。 俺qq:1239806145,再次謝謝啦。。。

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例[未登錄]  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2013-10-07 17:06 by widekuan
          大文件傳輸的效果貌似不是很好吧。。。

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2014-11-05 17:53 by afd
          不錯

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2014-11-05 17:53 by afd
          不錯 有用

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2015-03-31 17:21 by 1323
          樓主 請問如果要加個界面該怎么加

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

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

          怎樣彈出界面啊

          # re: Java基于Socket文件傳輸示例  回復  更多評論   

          2016-05-20 11:30 by tjh
          @tang
          @無味
          加div 彈出層
          主站蜘蛛池模板: 南澳县| 永善县| 永寿县| 江山市| 漾濞| 辰溪县| 永春县| 叶城县| 广东省| 花莲市| 邵阳县| 长白| 永春县| 开化县| 庐江县| 平昌县| 福贡县| 陇西县| 茂名市| 泰和县| 密山市| 嵊州市| 嘉义县| 卢湾区| 大同县| 九龙城区| 尚义县| 巴楚县| 龙口市| 万安县| 哈巴河县| 普格县| 永安市| 延庆县| 毕节市| 台湾省| 稷山县| 开封县| 广安市| 崇礼县| 枣强县|