2014-11-25 232 views
0

我是一個新手,我想完成從服務器到客戶端的「文件傳輸」,然後將文件發送回服務器。我使用的最基本的代碼是在這裏:Java:將文件從服務器傳輸到客戶端,從客戶端傳輸到服務器

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Main { 
    public static void main(String[] args) throws IOException { 
    ServerSocket servsock = new ServerSocket(123456); 
    File myFile = new File("s.pdf"); 
    while (true) { 
     Socket sock = servsock.accept(); 
     byte[] mybytearray = new byte[(int) myFile.length()]; 
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile)); 
     bis.read(mybytearray, 0, mybytearray.length); 
     OutputStream os = sock.getOutputStream(); 
     os.write(mybytearray, 0, mybytearray.length); 
     os.flush(); 
     sock.close(); 
    } 
    } 
} 

The client module 

import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.Socket; 

public class Main { 
    public static void main(String[] argv) throws Exception { 
    Socket sock = new Socket("127.0.0.1", 123456); 
    byte[] mybytearray = new byte[1024]; 
    InputStream is = sock.getInputStream(); 
    FileOutputStream fos = new FileOutputStream("s.pdf"); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 
    int bytesRead = is.read(mybytearray, 0, mybytearray.length); 
    bos.write(mybytearray, 0, bytesRead); 
    bos.close(); 
    sock.close(); 
    } 
} 

得到它從網站:http://www.java2s.com/Code/Java/Network-Protocol/TransferafileviaSocket.htm

我理解它是如何工作的,但我不知道如何發送一個文件回服務器。 請幫忙。

+0

插座是雙向的。保持打開並從服務器讀取回應。 – jtahlborn 2014-11-25 02:01:26

+0

我建議你使用HTTP,你的「服務器」是一個簡單的servlet。然後,您只需讀取請求並回答響應,servlet API將爲您完成剩下的工作(並在客戶端上使用HTTPURLConnection或其他HTTPClient代碼)。 – eckes 2014-11-25 02:03:41

+0

@jtahlborn所以,我應該省略服務器和客戶端上的sock.close(),然後添加寫入和讀取數據的反向鏈? – meowtwo 2014-11-25 02:06:00

回答

0

我已經寫過一個文件傳輸類,您可以在客戶端和服務器(通過創建一個實例)中使用它,並使用這些方法來發送和接收文件。

import java.io.*; 
import java.net.Socket; 

public class FileTransferProcessor { 
    Socket socket; 
    InputStream is; 
    FileOutputStream fos; 
    BufferedOutputStream bos; 
    int bufferSize; 


    FileTransferProcessor(Socket client) { 
     socket = client; 
     is = null; 
     fos = null; 
     bos = null; 
     bufferSize = 0; 

    } 

    void receiveFile(String fileName) { 
     try { 
      is = socket.getInputStream(); 
      bufferSize = socket.getReceiveBufferSize(); 
      System.out.println("Buffer size: " + bufferSize); 
      fos = new FileOutputStream(fileName); 
      bos = new BufferedOutputStream(fos); 
      byte[] bytes = new byte[bufferSize]; 
      int count; 
      while ((count = is.read(bytes)) >= 0) { 
       bos.write(bytes, 0, count); 
      } 
      bos.close(); 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    void sendFile(File file) { 

     FileInputStream fis; 
     BufferedInputStream bis; 
     BufferedOutputStream out; 
     byte[] buffer = new byte[8192]; 
     try { 
      fis = new FileInputStream(file); 
      bis = new BufferedInputStream(fis); 
      out = new BufferedOutputStream(socket.getOutputStream()); 
      int count; 
      while ((count = bis.read(buffer)) > 0) { 
       out.write(buffer, 0, count); 

      } 
      out.close(); 
      fis.close(); 
      bis.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

在幾個方面質量差。緩衝區不需要是文件的大小,也不必是靠近它的任何地方:這不會擴展到大文件。對於大多數目的來說,8192字節就足夠了。 'close()'之前的'flush()'是多餘的,在關閉它的輸入或輸出流之後''socket.close()'是一樣的。 'IOExceptions'永遠不應該變成布爾值:它們應該被記錄下來。資源應該在'finally'塊中關閉。 'try/catch'的模式,然後更多的代碼是不好的做法。依賴於'try'塊中代碼成功的代碼應該在同一個'try'塊中。 – EJP 2014-11-25 02:31:03

+0

我同意,謝謝。我寫了一段時間,記住它在很大程度上起作用,所以我沒有打算深入瞭解它。一有空,我會盡快提出建議。 – 2014-11-25 17:06:38

相關問題