java【Socket】【上傳下載檔案】
阿新 • • 發佈:2021-11-24
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(); } }