<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Java基于Socket文件傳輸示例

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

    最近需要進(jìn)行網(wǎng)絡(luò)傳輸大文件,于是對(duì)基于socket的文件傳輸作了一個(gè)初步的了解。在一位網(wǎng)友提供的程序基礎(chǔ)上,俺進(jìn)行了一些加工,采用了緩沖輸入/輸出流來(lái)包裝輸出流,再采用數(shù)據(jù)輸入/輸出輸出流進(jìn)行包裝,加快傳輸?shù)乃俣取U話少說(shuō),先來(lái)看服務(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(
    "文件長(zhǎng)度:" + (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());
                    
    //將文件名及長(zhǎng)度傳給客戶端。這里要真正適用所有平臺(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ù)過(guò)來(lái),
                    
    // 直到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ù)器端繼承而來(lái)。
                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(
    "文件的長(zhǎng)度為:" + 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ā)送文件的過(guò)程,當(dāng)然,反過(guò)來(lái),也一樣.稍有不同.代碼中對(duì)跨平臺(tái)的細(xì)節(jié)沒(méi)有實(shí)現(xiàn),有時(shí)間或興趣的朋友可以提供一下.

    評(píng)論

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

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

    # re: Java基于Socket文件傳輸示例[未登錄](méi)  回復(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)問(wèn)如何帶文件名并實(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文件傳輸示例[未登錄](méi)  回復(fù)  更多評(píng)論   

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

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

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

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

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

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

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

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

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

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

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

    # re: Java基于Socket文件傳輸示例[未登錄](méi)  回復(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 小女子
    樓主:很愛(ài)很愛(ài)你!!

    # 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ā)送,跨國(guó)文件傳送,跨國(guó)文件傳輸,網(wǎng)絡(luò)傳輸加速,跨國(guó)網(wǎng)絡(luò)傳輸,都是酷達(dá)的代名詞。
    酷達(dá)軟件科技有限公司,長(zhǎng)期以來(lái)致力于互聯(lián)網(wǎng)數(shù)據(jù)傳輸加速的研究,在互聯(lián)網(wǎng)數(shù)據(jù)傳輸加速方面處于全球領(lǐng)先地位。公司已經(jīng)為眾多的跨國(guó)企業(yè)提供大數(shù)據(jù)傳輸服務(wù)。公司擁有一批硅谷歸來(lái)的研發(fā)精英,在網(wǎng)絡(luò)傳輸加速方面積累了大量的技術(shù)創(chuàng)新;2007年10月,公司研發(fā)團(tuán)隊(duì)重拳出擊,在Qoodaa0.08中加入了自主創(chuàng)新的MNP2P技術(shù),在跨國(guó)傳輸方面取得了革命性的進(jìn)展,把競(jìng)爭(zhēng)對(duì)手遠(yuǎn)遠(yuǎn)地拋到了身后。擁有酷達(dá)傳輸,信息暢游天下。酷達(dá)流暢的界面,簡(jiǎn)單的操作,清新的風(fēng)格,超越極限的傳輸速度,最終奠定了酷達(dá)在互聯(lián)網(wǎng)大文件傳輸行業(yè)的霸主地位。公司在前進(jìn)的過(guò)程中經(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ā)送,跨國(guó)文件傳送,跨國(guó)文件傳輸,網(wǎng)絡(luò)傳輸加速,跨國(guó)網(wǎng)絡(luò)傳輸,都是酷達(dá)的代名詞。建議你使用酷達(dá)免費(fèi)軟件,這種軟件專門用來(lái)傳輸大文件的,我用了,速度非常快!在http://www.qoodaa.com.cn可以下載到

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

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

    # re: Java基于Socket文件傳輸示例[未登錄](méi)  回復(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
    精彩·~~我近來(lái)在寫UDP傳輸大文件

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

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

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

    2009-04-09 11:53 by jack
    你好,我想問(wèn)一下,為什么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è)用途,而且不加以說(shuō)明。公司所在地安徽合肥。不知道博主是否在安徽供職過(guò)。。
    實(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 小嘴
    看不懂 但是上面都說(shuō)好 我也說(shuō)好 謝謝

    # re: Java基于Socket文件傳輸示例[未登錄](méi)  回復(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文件傳輸示例[未登錄](méi)  回復(fù)  更多評(píng)論   

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

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

    2011-06-03 18:52 by jeny
    你好,請(qǐng)問(wèn)如果 只是通過(guò)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文件傳輸示例[未登錄](méi)  回復(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一年了,感覺(jué)有點(diǎn)迷茫,看到您的博客是從07年就開始,那時(shí)候俺還上高中呢,希望能得到您職業(yè)上面的指導(dǎo),謝謝啦。 俺qq:1239806145,再次謝謝啦。。。

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

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

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

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

    # 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)問(wèn)如果要加個(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ú)味
    我也是
    連接服務(wù)器成功!
    接收消息錯(cuò)誤

    怎樣彈出界面啊

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

    2016-05-20 11:30 by tjh
    @tang
    @無(wú)味
    加div 彈出層
    主站蜘蛛池模板: 一级毛片免费在线| 1000部禁片黄的免费看| 午夜男人一级毛片免费 | 亚洲av色香蕉一区二区三区蜜桃| 五月亭亭免费高清在线| 亚洲经典在线中文字幕| 中文字幕免费高清视频| 亚洲手机中文字幕| 久久久久久久久免费看无码| 久久久久se色偷偷亚洲精品av | 一级毛片大全免费播放| 久久久久亚洲AV成人网人人网站| www一区二区www免费| 在线观看亚洲成人| 日韩电影免费在线观看| 亚洲一本综合久久| 日韩免费观看视频| 国产在线观a免费观看| 18禁在线无遮挡免费观看网站| 亚洲欧洲美洲无码精品VA| 精品视频在线免费观看| 中文字幕亚洲第一在线| 中国在线观看免费高清完整版| 亚洲Av永久无码精品一区二区| 免费人成网站在线播放| a毛片全部免费播放| 亚洲视屏在线观看| 国产精品冒白浆免费视频| 一级做受视频免费是看美女 | 久久影院亚洲一区| 人妻无码一区二区三区免费 | 免费激情网站国产高清第一页| 亚洲精品乱码久久久久久久久久久久| 日韩成人免费视频| 亚洲精品无码日韩国产不卡av| 亚洲日韩在线观看| 成人免费一级毛片在线播放视频| 色偷偷亚洲男人天堂| 亚洲国产天堂在线观看| 日韩高清免费观看| 无码AV片在线观看免费|