通过TCP/IP传输文件在Windows中工作,但不能在Ubuntu中工作

通过TCP/IP传输文件在Windows中工作,但不能在Ubuntu中工作

问题描述:

我正试图用this guide的帮助,使用TCP/IP连接发送多个文件。通过TCP/IP传输文件在Windows中工作,但不能在Ubuntu中工作

当我从Ubuntu 14.04执行我的testClient代码时,文件被转移到Windows 7中的testServer。这里收到的.txt文件格式正确。

但是,当我从Windows 7和test 14.04执行testClients代码时,在Ubuntu 14.04中收到的文件被搞乱了。 (来自txt#2内容的内容泄漏到txt#1)

在交换过程中,testServer和testClient中的代码都没有更改,除了它们的IP地址和文件位置。

我很困惑。为什么代码在Windows 7中工作正常,但不在Ubuntu中?我的代码有问题吗?我将不胜感激任何帮助。

TestServer.java

public static void main(String[] args) throws IOException { 
    FileOutputStream fos; 
    BufferedOutputStream bos; 
    OutputStream output; 
    DataOutputStream dos; 
    int len; 
    int smblen; 
    InputStream in; 
    boolean flag = true; 
    DataInputStream clientData; 
    BufferedInputStream clientBuff; 

    ServerSocket serverSocket = new ServerSocket(5991); 
    serverSocket.setSoTimeout(500000); 
    System.out.println("Waiting for client on port " + serverSocket.getLocalPort()); 

    Socket clientSocket = null; 
    clientSocket = serverSocket.accept(); 
    System.out.println("Just connected to " + clientSocket.getRemoteSocketAddress()); 

    while (true){ 
     while(flag==true) { 
      in = clientSocket.getInputStream(); 
      clientData = new DataInputStream(in); 
      clientBuff = new BufferedInputStream(in); 

      int fileSize = clientData.read(); 
      if (fileSize != 0) 
       System.out.println("Receiving " + fileSize + " files.\n"); 

      //Store filenames and file sizes from client directory 
      ArrayList<File>files=new ArrayList<File>(fileSize); 
      ArrayList<Integer>sizes = new ArrayList<Integer>(fileSize); 

      //Server accepts filenames 
      for (int count=0; count<fileSize; count ++){ 
       File ff=new File(clientData.readUTF()); 
       files.add(ff); 
      } 

      for (int count=0; count<fileSize; count ++){ 
       sizes.add(clientData.readInt()); 
      } 

      for (int count=0; count<fileSize; count++) { 

       if (fileSize - count == 1) { 
        flag = false; 
       } 

       len = sizes.get(count); 

       output = new FileOutputStream("/home/pp/Desktop/inResources/" + files.get(count)); 
       dos = new DataOutputStream(output); 
       bos = new BufferedOutputStream(output); 

       byte[] buffer = new byte[1024]; 

       bos.write(buffer, 0, buffer.length); 

       while (len > 0 && (smblen = clientData.read(buffer)) > 0) { 
        dos.write(buffer, 0, smblen); 
        len = len - smblen; 
        dos.flush(); 
       } 
       dos.close(); 

       System.out.println("File " + files.get(count) + " with " + sizes.get(count) + " bytes recieved."); 
      } 

     } 

     if (flag == false) { 
      System.out.println("\nTransfer completed. Closing socket..."); 
      serverSocket.close(); 
      break; 
     } 
    } 
} 

TestClient.java

public static void main(String[] args) throws IOException { 
    String serverName = "192.168.1.12"; //IP address 
    int port = 5991; 

    Socket sock = new Socket(serverName, port); 
    System.out.println("Connected to " + serverName + " on port " + port + "\n"); 


    File myFile = new File("C:\\Users\\inter2\\Desktop\\noobs\\outResources"); 
    File[] files = myFile.listFiles(); 

    OutputStream os = sock.getOutputStream(); 
    DataOutputStream dos = new DataOutputStream(os); 

    //Sending total number of files in folder 
    dos.writeInt(files.length); 

    //Sending file names 
    for (int count=0; count<files.length; count++) { 
     dos.writeUTF(files[count].getName()); 
    } 

    //Sending file sizes 
    for (int count=0; count<files.length; count++) { 
     int filesize = (int) files[count].length(); 
     dos.writeInt(filesize); 
    } 

    //Sending of files 
    for (int count=0; count<files.length; count ++) { 
     int filesize = (int) files[count].length(); 
     byte [] buffer = new byte [filesize]; 

     FileInputStream fis = new FileInputStream(files[count].toString()); 
     BufferedInputStream bis = new BufferedInputStream(fis); 

     //Sending file name and file size to the server 
     bis.read(buffer, 0, buffer.length); 

     dos.write(buffer, 0, buffer.length); 
     dos.flush(); 


     System.out.println("Sending file " + files[count].getName() + " with " + filesize + " bytes."); 
    } 

    System.out.println("\n" + files.length + " files successfully transfered."); 
    sock.close(); 
} 

此代码从来没有工作过。

int fileSize = clientData.read(); 

在这里,你正在阅读的文件量,为byte

dos.writeInt(files.length) 

在这里你写这个数量,作为一个int。所以你的作者已经比你的阅读器领先三个字节了。

read()更改为readInt()以上。

其他说明:

接收:

byte[] buffer = new byte[1024]; 

这是确定的,但一个更大的缓冲区会更有效,说8192

bos.write(buffer, 0, buffer.length); 

这是一个错误。去掉它。您正在文件的开头写入1024个空字节。

while (len > 0 && (smblen = clientData.read(buffer)) > 0) { 
    dos.write(buffer, 0, smblen); 
    len = len - smblen; 
    dos.flush(); 

不要冲洗内循环。

} 

发送:

byte [] buffer = new byte [filesize]; 

    FileInputStream fis = new FileInputStream(files[count].toString()); 
    BufferedInputStream bis = new BufferedInputStream(fis); 

    //Sending file name and file size to the server 
    bis.read(buffer, 0, buffer.length); 

    dos.write(buffer, 0, buffer.length); 

没有必要浪费的文件大小的缓冲区。使用上面用于接收的相同代码。