2011-05-11 115 views
0

我正在嘗試設計一個客戶端 - 服務器應用程序,如下所示:用戶連接到服務器,當身份驗證正常時,服務器向用戶發送一些文件。問題是這些文件是用單個文件寫的(用我的方法)。客戶端服務器應用程序文件傳輸

下面是一些代碼:

這是選擇哪一個文件必須是文件

public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){ 
     String fileName; 
     if(tip==0){ 
      fileName="File"+Integer.toString(Intrebari[id])+".txt"; 
     }else{ 
      fileName="Image"+Integer.toString(Intrebari[id])+".jpg"; 
     } 
     byte[] buffer=null; 
     int bytesRead = 0; 
     FileInputStream file=null; 

     try { 
      file = new FileInputStream(fileName); 
      buffer = new byte[socket.getSendBufferSize()]; 
      while((bytesRead = file.read(buffer))>0) 
       { 
       oStream.write(buffer,0,bytesRead); 
       } 
      file.close(); 
     } catch (IOException ex) { 
      System.out.println(ex); 
     } 

    } 

和函數傳送功能發送

private void send(int id) throws IOException { 
     os.writeBytes("sendFile" + id+"\n"); 

     System.out.println("sendFile" + id); 
     generatedFiles.processFile(id, os, comunicare, 0); 
     if (generatedFiles.Imagini[id] == 1) { 
      os.writeBytes("sendImage" + id+"\n"); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println("sendImage" + id); 
      generatedFiles.processFile(id, os, comunicare, 1); 
     } 
    } 

我不得不提到osDataOutputStreamcomunicareSocket類型。

我認爲問題在於我將writeByteswrite結合在一起。任何人都可以幫我解決這個問題嗎?我怎樣才能使服務器和客戶端接收文件和消息?

+0

所以基本上你重塑FTP。爲什麼?這是功課嗎? – 2011-05-11 22:14:33

+0

是的。我必須做一個多項選擇應用程序,所以我必須爲用戶輸入它的用戶名和密碼,然後從服務器(存儲在一些文本文件中)下載問題。 – 2011-05-12 10:01:57

回答

1

我做這樣的事情:

服務器 - 發送命令 服務器 - 發送文件 客戶-confirms文件sucessfull

服務器 - 發送命令 服務器 - 發送文件 客戶-confirms文件sucessfull 。 ..

像這樣... supose你有一個客戶端的套接字,比你...

socket.getOutputStream.write(「FILE:SomeFile.bin,SIZE:872973493 \ r \ n」.getBytes(「choose an encoding」)) socket.getOutputStream.flush(); (你只需要刷新,如果你期待的服務器字符串響應,如:OK發送我的文件,IM就緒,否則不需要) 客戶端讀取並看到這是一個文件,它有這個字節大小,所以它啓動從socket.getInputStream讀取,直到它獲得預期的文件長度。 此客戶端確認後,他收回文件

然後服務器可以發送另一個文件,你可以做,而不是FILE,使用IMAGE或任何你想要的。你只需要讀取客戶端的消息,看它是否是一個文件或圖像

這裏有一些功能,可以幫助你:

public static void readInputStreamToFile(InputStream is, FileOutputStream fout, 
     long size, int bufferSize) throws Exception 
{ 
    byte[] buffer = new byte[bufferSize]; 
    long curRead = 0; 
    long totalRead = 0; 
    long sizeToRead = size; 
    while(totalRead < sizeToRead) 
    { 
     if(totalRead + buffer.length <= sizeToRead) 
     { 
      curRead = is.read(buffer); 
     } 
     else 
     { 
      curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead)); 
     } 
     totalRead = totalRead + curRead; 
     fout.write(buffer, 0, (int) curRead); 
    } 
} 


public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception 
{ 
    byte[] buffer = new byte[bufferSize]; 
    int count = 0; 
    while((count = in.read(buffer)) != -1) 
    { 
     out.write(buffer, 0, count); 
    } 
} 
+0

非常感謝fredcrs!如果我成功了,我會試一試並告訴你。再次感謝! – 2011-05-11 21:23:12

+0

您可以大大簡化readInputStreamToFile()。 'sizeToRead'只是'size'的一個副本,你永遠不會改變它,所以只需使用'size'。並且可以用curRead = in.read(buffer,0,(int)Math.min(buffer.length,size-totalRead))替換if/else。 – EJP 2011-05-12 00:02:24

+0

非常感謝fredcrs和EJP。用你的邏輯我已經設法傳輸文件。一切正常。如果有人對源代碼感興趣,請留言,我會發布它。 – 2011-05-12 16:10:28

相關問題