1. 程式人生 > >兩臺電腦間檔案傳輸Java程式設計原始碼

兩臺電腦間檔案傳輸Java程式設計原始碼

 

伺服器端

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();
    }
}

相關推薦

電腦檔案傳輸Java程式設計原始碼

  伺服器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java

電腦直連傳輸檔案的方法-飛秋

在對計算機硬碟重新分割槽或者在兩臺電腦之間進行資料轉移時,用U盤或者硬碟速度不夠快,最簡單的方法是兩臺計算機用網線直接相連,組成區域網,使用飛秋傳輸資料。 1、將兩臺電腦用網線連線 2、兩臺電腦分別裝上飛秋(如果一臺電腦上有多塊有線網絡卡,在飛秋-網路設定中應選擇正確的網

windows socket程式設計實現電腦的通訊

首先需要兩臺電腦,可以兩個同學共同來完成;當然,如果自己有兩臺電腦的話就更好了! 在一臺電腦上建立一個TCP Socket伺服器應用程式 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include

電腦大量數據拷貝的快捷方法

兩臺 電腦間 大量數據 可能大家會遇到需要將一臺電腦裏的數據拷貝到另外一臺電腦,最常用的方法是用u盤或移動硬盤等存儲設備來拷貝,這樣速度慢,而且可能拷貝多次才能將數據拷貝完。現提供一種方法,就是通過windows 的文件共享來實現。通過千兆網線直接連接兩臺電腦,再用軟件輔助,就可以快速提高拷貝速度

OneDrive電腦之間檔案同步操作

我們經常會遇到這樣的場景:辦公室電腦和個人電腦上的檔案需要進行同步。U盤、網盤都是可選方案,但是都需要編輯完後拷貝到這些介質中,然後再在另一臺機器上拷貝出來。有沒有更簡便的方法呢,摸索了一番後,發現Windows系統自帶的OneDrive使用起來更簡單。 OneDrive最大的優勢就是編輯完文件後,可以自動

同一網段電腦共享檔案

需要訪問D機器的檔案,所以在D電腦設定: 1、在D機器上,右鍵點‘網路上的芳鄰’,點屬性,然後點‘高階’--‘設定’,關閉防火牆,同時確定Guest使用者是開啟狀態,具體是右鍵點‘我的電腦’--管理--本地使用者和組---雙擊右面視窗的Guest使用者,然後把停用此賬戶前面的勾去掉。 新增

如何快速在電腦之間傳輸檔案

兩臺電腦如何傳檔案最快方法。我們在使用電腦的時候,有的情況下需要我們隊兩臺電腦之間互相的傳輸大檔案。那麼我們應該通過什麼樣的方法傳輸最快速呢?我們一起來看看吧。   首先我們需要一根平時上網連線網路時用的網線。   網線的兩端分別連線在你的兩臺電腦網線插口處。   連線好了之

區域網內地電腦如何傳輸檔案

兩臺電腦都設定網路共享選項 控制面板\網路和 Internet\網路和共享中心\高階共享設定下面開啟網路發現和開啟檔案和印表機共享 PC1設定共享資料夾 (右鍵屬性\共享) pc2 通過 \pc1n

不用U盤,用一根網線在電腦之間傳輸檔案

有一次要給朋友傳一部電影恰好沒有帶U盤,而且又不能上網,不知道怎麼辦。後來就上網搜尋加自我摸索,總結了一些方法。只要你身邊有一條網線或者你們的電腦處在同一個局域網裡,就可以實現傳輸資料。下面是我總結的一些方法。 前提:用網線將兩臺電腦連線起來,並設定成同一個區域網(如把A

伺服器的資料傳輸

命令:當前伺服器執行 scp  -r /usr/local/test   [email protected]目標伺服器公網ip:/home/app/PicAnalyser/    ps:加上-r引數直接拷貝整個資料夾(速度相當快)  

Flume Avro 機器進行資料傳輸的方式

flume 通過avro方式在兩臺機器之間進行資料傳輸 比如要在192.168.17.18 上把資料傳到 192.168.17.17 1 首先要再兩臺機器上都部署 flume 2 在 17 flume下這樣配置 avro-flume.conf agent3.channel

電腦之間如何收發檔案

如圖,在OSI參考模型中,當一臺主機需要傳送使用者的資料(DATA)時,資料首先通過應用層的介面進入應用層。在應用層,使用者的資料被加上應用層的報頭(Application Header,AH),形成應用層協議資料單元(Protocol Data Unit,PDU),然後被遞交到下一層-表示層。      表

Linux系統之間傳輸檔案的幾種方法

scp傳輸 當兩臺LINUX主機之間要互傳檔案時可使用SCP命令來實現 scp傳輸速度較慢,但使用ssh通道保證了傳輸的安全性 複製檔案 將本地檔案拷貝到遠端 scp 檔名 –使用者名稱@計算機I

【網路 】電腦之間如何收發檔案

一、在講解之前,咱們先準備一些理論知識 1、OSI七層模型(參考模型) OSI(Open System Interconnect),即開放式系統互聯。 一般都叫OSI參考模型,是ISO(國際

電腦在linux終端互傳檔案

假設我當前在使用的電腦是A,伺服器是B,那麼我們先要確認B的IP地址。假設B的IP是192.168.2.208 1、從服務端copy檔案到本地。比如伺服器的home下有一個檔案是a.txt,那麼命令是:scp [email protected]:/h

如何用一根網線實現在電腦之間傳輸資料

下面我來說一說怎樣用一根網線連線兩臺電腦,從而實現資料的傳輸。 首先,我們要在兩臺電腦上分別設定其IPv4的配置。 第一臺電腦的設定步驟如下: 開啟網路和共享中心 ,點選更改設配器設定,在乙太網那裡右鍵屬性, 雙擊Internet 協議版本4(TCP/I

自己的電腦,在局域網中,可以快速共享電腦的文件,可以很方便操作。

帳戶 程序 設置 連接 啟動 臺電 即使 臺電腦 同時登錄 1.可以啟用遠程控制,讓A控制B。這樣比較方便。 2.在同一個局域網中,可以讓兩臺機器在局域網中,設置某些文件夾共享。這樣可以非常方便,而且這樣操作,A就像同時擁有A和B兩臺電腦的硬盤一樣。而且還可以同時操作兩臺電

5*.211.24*.27/29 防火墻下面直接接一個小交換機配電腦可以的 親自實驗

交換機 防火墻 兩臺電腦 5*.211.24*.27/29 共有6個可以上網的地址 25 26 27 28 29 30 防火墻下面直接接一個小交換機配兩臺電腦可以的 親自實驗本文出自 “宏宏在線” 博客,請務必保留此出處http://215363.blog.51cto.com/205363/1

電腦如何共享文件

ear 打開控制面板 -o sig cdb 雙擊 https audio 技術 有些在局域網的朋友想讓一臺電腦上的文件復制到另一臺電腦上,可是又沒有可移動設備不知道該怎麽辦,下面我給大家演示一下,一定按照步驟做哦 https://jingyan.baidu.com/arti

電腦可以互相傳送文件嗎

src ati 遊戲 就是 兩個人 重要 用戶 本地用戶和組 wifi 我們在更換新電腦的時候,發現舊電腦上還有一些重要的資料或者電影照片,甚至是遊戲,而且文件較大,甚至可達幾十GB,單純用U盤來挪動文件,是非常浪費時間的。今天小編就來教大家一下兩臺電腦如何相互連接傳送文件