1. 程式人生 > >java實現伺服器和客戶端之間的檔案傳輸

java實現伺服器和客戶端之間的檔案傳輸

實現思路

一、客戶端發文件:首先建立和伺服器的連線,然後我們通過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();
			}			
		 }		 
	 }	 	 
}

大家在使用時,注意修改檔案的源地址和目標地址。