java實現伺服器和客戶端之間的檔案傳輸
阿新 • • 發佈:2018-12-30
實現思路
一、客戶端發文件:首先建立和伺服器的連線,然後我們通過IO流來實現資料的傳輸,步驟:
1、通過伺服器的IP地址和埠號實現和伺服器的連線(這裡不要忘記先開伺服器哦)
2、獲取本地的檔案的地址,建立java和檔案的連線。
3、獲取檔案輸入流和資料輸出流(注意:這裡的輸入和輸出都是指對於java,檔案輸入流的物件名可以為fis,資料輸出流的物件名可以為dos;反之,檔案輸出流fos,資料輸入流dis,即和前者相反的過程)
4、寫檔案。
二、伺服器收檔案:
1、接收客戶端建立連線的申請,生成一個socket物件。
2、賦予一個伺服器端的檔案地址(之後在寫資料的時候如果檔案不存在,則自動建立檔案並寫資料,若存在檔案,則會覆蓋原檔案,如果要不覆蓋可以這樣改:fos = new FileOutputStream(file,true);)
3、獲取資料輸入流和檔案輸出流。
4、讀檔案。
程式碼實現
我在程式碼中實現了先發一段字串再發一個完整的檔案,檔案前的字串作為檔案附帶資訊,作為檔案的資訊補充。在聊天室的編寫中,可以用來補充檔案的傳送者和接受者資訊。
1、客戶端:
public class Client { public static void main(String[] args){ int length =0; FileInputStream fis = null; DataOutputStream dos = null; Socket socket = null; OutputStream out =null; PrintWriter pw = null; byte[] sendByte = null; try { socket = new Socket("localhost",7777); out = socket.getOutputStream(); pw = new PrintWriter(out); System.out.println("連線到伺服器成功"); File file = new File("E:\\workspace\\mayifan\\src\\com\\myf\\clientTest1207\\tree.zip"); fis = new FileInputStream(file); dos = new DataOutputStream(socket.getOutputStream()); sendByte = new byte[1024]; pw.write("123"+"\r\n"); pw.flush(); pw.write("456"+"\r\n"); pw.flush(); System.out.println("準備傳送"); while((length=fis.read(sendByte))>0){ dos.write(sendByte, 0 , length); dos.flush(); } System.out.println("檔案傳送完畢"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { fis.close(); dos.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
2、伺服器:
public class Server { public static void main(String[] args){ DataInputStream dis=null; Socket socket =null; FileOutputStream fos =null; InputStreamReader ir = null; BufferedReader br = null; try{ int length=0; byte[] getByte = new byte[1024]; ServerSocket ss = new ServerSocket(7777); System.out.println("伺服器建立完畢"); socket = ss.accept(); ir=new InputStreamReader(socket.getInputStream()); br=new BufferedReader(ir); System.out.println("連線到客戶端"); dis = new DataInputStream(socket.getInputStream()); File file = new File("E:\\workspace\\mayifan\\src\\com\\myf\\serverTest1207\\tree1.zip"); fos = new FileOutputStream(file); String first = br.readLine(); String second = br.readLine(); System.out.println(first); System.out.println(second); System.out.println("準備接收檔案"); while((length=dis.read(getByte))>0){ fos.write(getByte, 0, length); fos.flush(); } System.out.println("檔案接收完畢"); }catch(IOException e){ e.getStackTrace(); }finally{ try { dis.close(); fos.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
大家在使用時,注意修改檔案的源地址和目標地址。