1. 程式人生 > 其它 >java【Socket】【上傳下載檔案】

java【Socket】【上傳下載檔案】

public class TCPClient {
    public static void main(String[] args)throws IOException {
        Socket socket = new Socket("127.0.0.1",5000);
        OutputStream out = socket.getOutputStream();
        //建立檔案物件     如果檔案路徑寫錯   Client報找不到檔案異常,Server報Connection Reset異常
        File file = new File("E:\\Pictures\\010.jpg");  
        //位元組輸入流,讀取本地檔案到java程式中
        FileInputStream fis = new FileInputStream(file);
        byte[] data = new byte[1024];              //陣列,增強傳輸效率
        int len = 0;
        while((len = fis.read(data)) != -1)   //read方法返回陣列的有效字元個數
            out.write(data, 0, len);                              
        socket.shutdownOutput();  //資料傳輸完畢,關閉socket輸出流,避免伺服器端read方法阻塞

        InputStream in = socket.getInputStream();      //位元組輸入流,讀取伺服器返回的資料
        len = in.read(data);
        System.out.println(new String(data,0,len));

        socket.close();
        fis.close();
    }

   }



   public class TCPServer {
    public static void main(String[] args)throws IOException {
        ServerSocket server = new ServerSocket(5000);//開啟伺服器制定埠,等待客戶端連線
        //獲得與伺服器相連的套接字物件     套接字:繫結ip地址和埠號的網路物件
        Socket socket = server.accept();
        //檢視該地址資料夾是否存在,如果不存在,建立一個
        File file = new File("E:\\TestFolder\\upload"); 
        if(!file.exists()){
            boolean b = file.mkdirs();
            System.out.println(b);
        }   
        InputStream in = socket.getInputStream();  //套接字的位元組輸入流,讀取客戶端傳過來的資料

        String name = System.currentTimeMillis()+""+new Random().nextInt(9999);        //隨機檔名
        FileOutputStream fos = new FileOutputStream(file+File.separator+name+".jpg");  //File.separator表示分隔符,windows是\,linux是/             
        byte[] data = new byte[1024];
        int len = 0;
//如果客戶端沒有關閉socket輸出流,這裡的read方法會一直讀取,對於socket流沒有流末尾之說,不可能返回-1
        while((len = in.read(data)) != -1)  
            fos.write(data, 0, len);
        data = "上傳成功!".getBytes();      //字串轉化為位元組陣列
        OutputStream out = socket.getOutputStream();     //建立位元組輸出流
        out.write(data);                //寫入上傳成功  ,反饋給客戶端   
        server.close();
        fos.close();
    }

}