<b id="yt35u"></b>
  • <b id="yt35u"></b>

  • <tt id="yt35u"><form id="yt35u"></form></tt>
    <button id="yt35u"></button>

    <button id="yt35u"></button>

    <strike id="yt35u"><dfn id="yt35u"></dfn></strike>

    <i id="yt35u"></i>
    1. <tt id="yt35u"></tt>
      <b id="yt35u"><sub id="yt35u"><tr id="yt35u"></tr></sub></b>

      教育路上

      全國站>Java>網絡編程>Java TCP 案例-文件上傳
      學員需求

      Java TCP 案例-文件上傳

      摘要:Java TCP 案例 文件上傳 ,要使用 TCP 協議來實現。接下來通過一個案例來實現圖片上傳的功能,首先編寫服 務器端程序,。以下是我們為大家整理的,相信大家閱讀完后肯定有了自己的選擇吧。

      2022-05-18 16:40網絡推薦

      發布時間:
      2022-05-18 16:40
      信息來源:
      網絡推薦
      瀏覽次數:
      1403
      Java TCP 案例-文件上傳

      目前大多數服務器都會提供文件上傳的功能,由于文件上傳需要數據的安全性和完整性,
      很明顯需要使用 TCP 協議來實現。接下來通過一個案例來實現圖片上傳的功能,首先編寫服
      務器端程序,用來接收圖片,如例 13-13 所示。
      例 13-13 Example07.java
      import java.io.*;
      import java.net.*;
      public class Example07 {
      public static void main(String[] args) throws Exception {
      ServerSocket serverSocket = new ServerSocket(10001); // 創建
      ServerSocket 對象
      while (true) {
      // 調用 accept()方法接收客戶端請求,得到 Socket 對象
      Socket s = serverSocket.accept();
      // 每當和客戶端建立 Socket 連接后,單獨開啟一個線程處理和客戶端
      的交互
      new Thread(new ServerThread(s)).start();
      }
      }
      }
      class ServerThread implements Runnable {
      private Socket socket; // 持有一個 Socket 類型的屬性
      public ServerThread(Socket socket) { // 構造方法中把 Socket 對象作為實參
      傳入
      this.socket = socket;
      }
      public void run() {
      String ip = socket.getInetAddress().getHostAddress(); // 獲取客戶端
      的 IP 地址
      int count = 1; // 上
      傳圖片個數
      try {
      InputStream in = socket.getInputStream();
      File parentFile = new File("d:\\upload\\"); // 創建上傳圖片目
      錄的 File 對象
      if (!parentFile.exists()) { // 如果不存在,
      就創建這個目錄
      parentFile.mkdir();
      }
      // 把客戶端的 IP 地址作為上傳文件的文件名
      File file = new File(parentFile, ip + "(" + count + ").jpg");
      while (file.exists()) {
      // 如果文件名存在,則把 count++
      file = new File(parentFile, ip + "(" + (count++) + ").jpg");
      }
      // 創建 FileOutputStream 對象
      FileOutputStream fos = new FileOutputStream(file);
      byte[] buf = new byte[1024]; // 定義一個字節數組
      int len = 0; // 定義一個 int 類型的變量 len,初始值為 0
      while ((len = in.read(buf)) != -1) { // 循環讀取數據
      fos.write(buf, 0, len);
      }
      OutputStream out = socket.getOutputStream();// 獲取服務端的輸出

      out.write("上傳成功".getBytes()); // 上傳成功后向
      客戶端寫出"上傳成功"
      fos.close(); // 關閉輸出流對象
      socket.close(); // 關閉 Socket 對象
      } catch (Exception e) {
      throw new RuntimeException(e);
      }
      }
      }

      運行結果如圖 13-21 所示。

      from shengerguan

      例 13-13 中創建一個 ServerSocket 對象在 while(true)無限循環中調用 ServerSocket
      的 accept()方法來接收客戶端的請求,每當和一個客戶端建立 Socket 連接后就開啟一個新
      的線程和這個客戶端進行交互。開啟的新線程是通過實現 Runnable 接口創建的,重寫 run()
      方法中實現了服務器端接收并保存客戶端上傳圖片的功能在代碼的第 24 行,對上傳圖片的
      保存目錄用一個 File 對象進行封裝,如果這個目錄不存在就調用 File 的 mkdir()方法創建
      這個目錄。為了避免存放的圖片名重復而造成新上傳的圖片把已存在的圖片覆蓋,在代碼的
      第 21 行定義了一個整型變量 count,用于統計圖片的數目,使用"IP 地址(count).jpg"作
      為上傳圖片的名字。在代碼的第 30~33 行對表 count++。最后將從客戶端接收的圖片信息寫
      人到指定的日錄中,在代碼的第 40 行和第 41 行獲得服務器端的輸出流,向客戶端輸出"上
      傳成功"信息。通過圖 13-21 運行結果可以看出,服務器端進人阻塞狀態,等待客戶端連接。
      完成了服務器端程序的編寫,下面來編寫客戶端上傳程序,如例 13-14 所示。
      例 13-14 Example08.java
      import java.io.*;
      import java.net.*;
      public class Example08 {
      public static void main(String[] args) throws Exception {
      Socket socket = new Socket("127.0.0.1", 10001); // 創建客戶端 Socket
      OutputStream out = socket.getOutputStream(); // 獲取 Socket 的輸出流對象
      // 創建 FileInputStream 對象
      FileInputStream fis = new FileInputStream("D:\\1.jpg");
      byte[] buf = new byte[1024]; // 定義一個字節數組
      int len; // 定義一個 int 類型的變量 len
      while ((len = fis.read(buf)) != -1) { // 循環讀取數據
      out.write(buf, 0, len);
      }
      socket.shutdownOutput(); //關閉客戶端輸出

      InputStream in = socket.getInputStream(); // 獲取 Socket 的輸入
      流對象
      byte[] bufMsg = new byte[1024]; // 定義一個字節數

      int num = in.read(bufMsg); //接收服務端的信

      String Msg = new String(bufMsg, 0, num);
      System.out.println(Msg);
      fis.close(); // 關鍵輸入流
      對象
      socket.close(); // 關閉
      Socket 對象
      }
      }
      運行結果如圖 13-22 所示。



      from shengerguan


      例 13-14 中,首先在代碼的第 5 行創建 Socket 對象,指定連接服務器的 IP 地址和端口 號,然后獲取 Socket 的輸出流對象。在代碼的第 7~13 行,創建 FilelnputStream 對象讀取 圖片 1.jpg,并通過 Socket 的輸出流對象向服務器端發送圖片。發送完畢后調用 Socket 的 shutDownOutput()方法關閉客戶端的輸出流。需要注意的是,shutDownOutput()方法非常重 要,因為服務器端程序在 while 循環中讀取客戶端發送的數據,當讀取到-1 時才會結束循環, 如果在客戶端不調用 shutDownOutput()方法關閉輸出流,服務器端就不會讀到-1,而會一直 執行 while 循環,同時客戶端讀取服務器端數據的 read(byte [])方法也是個阻塞方法,這樣 服務器端和客戶端程序進入了一個“死鎖”狀態,兩個程序都不能結束。 客戶端上傳圖片成功后,會讀取服務器端發送的“上傳完畢”信息,至此,客戶端程序的 編寫也完成了。為了證實圖片是否上傳成功,進入 D:\\upload 目錄下,在該目錄下可以看 見一張以 IP+count 編號命名的圖片,說明圖片上傳成功,如圖 13-23 所示。

      from shengerguan


      上一篇:
      Java多線程的 TCP 網絡程序
      下一篇:
      java聊天室服務器端程序
      標簽:
      網友評論
      發布評論

      訪客的評論 2024/07/10 12:44

      文中描述的是準確的嗎,如何報名!

      相關推薦
      我也來發表評價關閉
      我對該內容的評價:
      0
      評價500
      驗證碼: 看不清 換一張
      提交 (匿名發布,無須擔心別人知道您的身份)
      學校免費發布信息關閉
      我們審核后會盡快展示,如有圖片請發郵件到:edu63@foxmail.com

      姓      名:

      內      容:

      手機號碼:

      驗  證  碼:  換一張

      確認提交
      填寫需求信息關閉
      我們會根據您的需求匹配并審核留言

      姓      名:

      意向城市:

      留      言:

      手機號碼:

      驗  證  碼:  換一張

      確認提交
      完善補充本文信息關閉
      非常感謝您幫助完善補充本文信息


       換一張

      確認提交
      女班长给我看她的小内内

        <b id="yt35u"></b>
    1. <b id="yt35u"></b>

    2. <tt id="yt35u"><form id="yt35u"></form></tt>
      <button id="yt35u"></button>

      <button id="yt35u"></button>

      <strike id="yt35u"><dfn id="yt35u"></dfn></strike>

      <i id="yt35u"></i>
      1. <tt id="yt35u"></tt>
        <b id="yt35u"><sub id="yt35u"><tr id="yt35u"></tr></sub></b>