Java:将文件从服务器传输到客户端,从客户端传输到服务器

问题描述:

我是一个新手,我想完成从服务器到客户端的“文件传输”,然后将文件发送回服务器。我使用的最基本的代码是在这里: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

我已经写过一个文件传输类,您可以在客户端和服务器(通过创建一个实例)中使用它,并使用这些方法来发送和接收文件。

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