<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    Java基于Socket文件傳輸示例

    Posted on 2007-10-13 09:11 詩特林 閱讀(91376) 評論(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 彈出層
    主站蜘蛛池模板: 亚洲欧洲∨国产一区二区三区| 国产jizzjizz免费看jizz| 18禁免费无码无遮挡不卡网站| 国产v精品成人免费视频400条| 成人免费网站在线观看| 亚洲精品动漫人成3d在线| 人妻丰满熟妇无码区免费 | 美女尿口扒开图片免费| 久久精品免费网站网| 免费人成视频在线观看网站| a级毛片无码免费真人| 免费在线观看毛片| 亚洲av无码成h人动漫无遮挡| 亚洲国产精品免费在线观看| 国产精品亚洲五月天高清| a毛看片免费观看视频| 久久午夜免费视频| 亚洲精品偷拍视频免费观看| 亚洲成色999久久网站| 亚洲欧洲日韩极速播放 | 亚洲精品宾馆在线精品酒店| g0g0人体全免费高清大胆视频| 无码国产精品一区二区免费vr| 在线观看免费高清视频| 国产亚洲精品拍拍拍拍拍| 亚洲制服丝袜一区二区三区| 亚州**色毛片免费观看| 免费观看激色视频网站(性色)| 免费欧洲美女牲交视频| 久久亚洲精品成人av无码网站| 亚洲avav天堂av在线网毛片| 免费一级毛片无毒不卡| 日韩中文无码有码免费视频 | 又粗又大又黑又长的免费视频 | 亚洲精品成人区在线观看| 亚洲黑人嫩小videos| 免费无码午夜福利片| 100000免费啪啪18免进| 亚洲熟妇无码另类久久久| 国产成人精品亚洲日本在线| 中国黄色免费网站|