国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

淺析Java基于Socket的文件傳輸案例

2019-11-26 14:36:06
字體:
來源:轉載
供稿:網友

本文實例介紹了Java基于Socket的文件傳輸案例,分享給大家供大家參考,具體內容如下

1、Java代碼

package com.wf.demo.socket.socketfile;  import java.net.*; import java.io.*;  /**  * 2.socket的Util輔助類  *  * @author willson  *  */ 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) {     }   } } 

2、Java代碼

package com.wf.demo.socket.socketfile;  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;  /**  * 1.服務器端  *  * @author willson  *  */ public class ServerTest {      int port = 8821;    void start() {          Socket socket = null;          try {              ServerSocket serverSocket = new ServerSocket(port);              while (true) {         // 選擇進行傳輸的文件         String filePath = "E://lib.zip";                  File fi = new File(filePath);          System.out.println("File Name:" + fi.getName() + ";/tFile Size():" + (int) fi.length() + "bytes");          // public Socket accept() throws         // IOException偵聽并接受到此套接字的連接。此方法在進行連接之前一直阻塞。                   System.out.println("等待客戶端連接,連接端口:" + port);         socket = serverSocket.accept();                  System.out.println("建立socket鏈接");                  DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));                  dis.readByte();          DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));                  DataOutputStream ps = new DataOutputStream(socket.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();         socket.close();                  System.out.println("文件傳輸完成/n");       }      } catch (Exception e) {       e.printStackTrace();     }   }    public static void main(String arg[]) {     new ServerTest().start();   } }   


3、客戶端

package com.wf.demo.socket.socketfile;  import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream;  /**  * 3.客戶端  *  * @author willson  *  */ 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("F://");       }     } 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(String savePath) {          if (cs == null)       return;     DataInputStream inputStream = null;     try {       inputStream = cs.getMessageStream();     } catch (Exception e) {       System.out.print("接收消息緩存錯誤/n");       return;     }      try {              // 本地保存路徑,文件名會自動從服務器端繼承而來。       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("File Size():" + len + "bytes");       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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 比如县| 鱼台县| 双辽市| 翼城县| 儋州市| 汉川市| 武义县| 平远县| 巴楚县| 蒙自县| 浦江县| 宁波市| 文水县| 彭水| 都江堰市| 山东省| 汨罗市| 东阿县| 铜陵市| 玛多县| 保康县| 恭城| 交口县| 中牟县| 景德镇市| 中江县| 通州区| 龙泉市| 甘南县| 崇左市| 丁青县| 内黄县| 红安县| 宁阳县| 台南市| 察隅县| 许昌市| 河津市| 连江县| 宁夏| 太仓市|