首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 圖片上傳完整代碼實現與 Socket 通訊詳解

     編輯:Java 相關知識

Java 圖片上傳完整代碼實現

本文提供一個基於 Java Socket 通訊的圖片上傳完整代碼範例,包含客戶端發送端與伺服器端接收端的完整實現,適合初學者參考學習網路程式設計與檔案傳輸機制。

核心功能特點

  • 支援 JPG 格式圖片上傳
  • 檔案大小限制 10MB 以內
  • 採用 TCP Socket 可靠傳輸協議
  • 包含上傳狀態回饋機制
  • 多執行緒處理並發連線

客戶端發送端實現 (picsend 類)

import java.io.*;
import java.net.*;

class picsend {
    public static void main(String[] args) throws Exception {
        // 參數檢查
        if(args.length != 1) {
            System.out.println("請選擇一張 .jpg 圖片");
            return;
        }
        
        File file = new File(args[0]);
        // 檔案存在性與格式驗證
        if(!(file.exists() && file.isFile())) {
            System.out.println("圖片有問題(不是檔案或不存在)");
            return;
        }
        if(!file.getName().endsWith(".jpg")) {
            System.out.println("圖片格式錯誤,請重新選擇圖片");
            return;
        }
        if(file.length() > 1024 * 1024 * 10) {
            System.out.println("圖片過大,無法上傳");
            return;
        }
        
        // 建立 Socket 連線
        Socket s = new Socket("192.168.33.1", 10006);
        FileInputStream fis = new FileInputStream(file);
        OutputStream out = s.getOutputStream();
        
        // 分塊讀取並傳輸
        byte[] buffer = new byte[1024];
        int len;
        while((len = fis.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        
        // 關閉輸出流,標記傳輸結束
        s.shutdownOutput();
        
        // 接收伺服器回應
        InputStream in = s.getInputStream();
        byte[] response = new byte[1024];
        int num = in.read(response);
        System.out.println(new String(response, 0, num));
        
        fis.close();
        s.close();
    }
}

伺服器端接收端實現 (picThread 與 picrece 類)


// 處理執行緒類
class picThread implements Runnable {
    private Socket socket;
    
    picThread(Socket socket) {
        this.socket = socket;
    }
    
    public void run() {
        int count = 1;
        String clientIP = socket.getInetAddress().getHostAddress();
        System.out.println(clientIP + ".............connect");
        
        try {
            InputStream in = socket.getInputStream();
            // 避免檔名衝突
            File file = new File(clientIP + "(" + count + ")" + ".jpg");
            while(file.exists()) {
                file = new File(clientIP + "(" + (count++) + ")" + ".jpg");
            }
            
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            int len;
            while((len = in.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            
            // 發送成功回應
            OutputStream out = socket.getOutputStream();
            out.write("上傳成功!".getBytes());
            
            fos.close();
            socket.close();
        } catch (Exception e) {
            throw new RuntimeException("上傳失敗");
        }
    }
}

// 伺服器主類
class picrece {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(10006);
        while(true) {
            Socket socket = serverSocket.accept();
            new Thread(new picThread(socket)).start();
        }
    }
}

關鍵技術點解析

1. Socket 通訊流程

客戶端透過 Socket 連接伺服器指定 IP 與埠號,獲得輸出流將檔案資料寫入網路;伺服器端使用 ServerSocket 監聽埠號,接受連線後為每個客戶端建立獨立執行緒處理。

2. 檔案傳輸機制

採用緩衝區分塊讀寫方式,每次讀取 1KB 資料,透過 FileInputStream 讀取本地檔案,經由網路輸出流傳送;接收端使用 FileOutputStream 寫入本地磁碟。

3. 傳輸結束標記

客戶端呼叫 shutdownOutput() 關閉輸出流,向伺服器發送「流結束」信號,伺服器端 read() 返回 -1 即知傳輸完成。

4. 多執行緒併發處理

伺服器端為每個連線建立獨立 Thread,實現多客戶端同時上傳互不阻塞。

執行結果說明

程式執行後,客戶端將指定圖片上傳至伺服器,伺服器以客戶端 IP 命名儲存,並回傳「上傳成功!」訊息。若檔案不存在、格式錯誤或超過大小限制,客戶端會給出相應提示。

改進建議

  • 增加檔案完整性校驗(如 MD5)
  • 支援更多圖片格式(PNG、GIF 等)
  • 實作斷點續傳功能
  • 加入 SSL/TLS 加密傳輸
  • 使用 NIO 提升併發效能

以上即為 Java 圖片上傳完整代碼的詳細實現與解析,希望對學習 Java 網路程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved