发送通过套接字接收多个文件

时间:2014-10-17 00:19:49

标签: java sockets

在尝试了我能想到的所有内容后,我无法让这段代码工作2天。我知道这个确切的问题已被提出并得到解答,但我仍然无法让我的工作正常。我试图通过套接字发送多个文件。

我修改了代码以在每次接收之前接收文件大小,但它仍然无法正常工作。我可以让它将所有数据发送到一个文件中,但是当我应用其他帖子中建议的while循环时,它只发送1个文件然后停止或根本没有。如果可能的话,有人可以纠正这个,所以我可以继续前进。自从iv出现这个问题已经差不多一个星期了,即使我明白自己需要做什么,也无法让语法更加正确。

任何帮助都将不胜感激。

接收代码:

 private void receiveFile() throws IOException{

        String fileToReceive = "test" + increment;
        int bytesRead;
        int current = 0;
        DataInputStream inputs = new DataInputStream(connection.getInputStream());


        long fileLength = inputs.readLong();
        int total = 0;

        //receive file
        try{
          byte [] mybytearray  = new byte [(int)fileLength];
          is = connection.getInputStream();
          fos = new FileOutputStream(fileToReceive);
          bos = new BufferedOutputStream(fos);
          bytesRead = is.read(mybytearray,0,mybytearray.length);


          while(fileLength > 0 &&(total = is.read(mybytearray, 0, (int)Math.min(mybytearray.length, fileLength))) != -1){
             bos.write(mybytearray, 0, total);
             fileLength -= total;
          }


          System.out.println("File " + fileToReceive + " downloaded (" + current + " bytes read)");
        }finally{
//          if (fos != null) fos.close();
//          if (bos != null) bos.close();
//          if (connection != null) connection.close();
        }   
        increment += 1;
      }
}

发送代码

public void sendFile(String file) throws IOException, ClassNotFoundException{

    FileInputStream fis = null;
    BufferedInputStream bis = null;
    OutputStream dos = null;
    DataOutputStream outputs = new DataOutputStream(connection2.getOutputStream());

    try{
        dos = connection2.getOutputStream();
        File myFile = new File (file);
        byte [] mybytearray  = new byte [(int)myFile.length()];

        outputs.writeLong(myFile.length());

        fis = new FileInputStream(myFile);
        bis = new BufferedInputStream(fis);
        dos.write(mybytearray,0,mybytearray.length);
        System.out.println("Sent " + file + "(" + mybytearray.length + " bytes)");
        dos.flush();

    }catch(Exception ex){
        ex.printStackTrace();
    }
    finally{

    }
}

1 个答案:

答案 0 :(得分:0)

您还没有提供管理Socket对象本身的代码,但听起来您正试图重新打开套接字,这是不可能的。来自JavaDoc:

  

一旦套接字关闭,它就无法用于进一步的网络连接(即无法重新连接或反弹)。需要创建一个新的套接字。

您最好的选择是保持套接字打开,只需在每个文件的末尾刷新它。然后,您需要一种简单的方法来判断文件何时结束(因为套接字只不过是在两个端点之间流动的一串字节)。

最简单的方法是首先以预定义的字节数发送文件的大小(比如说8个字节是极端安全的)。发送文件时,首先发送8个字节,然后发送文件的内容。接收器知道期望这个序列,所以它读取8个字节,解析它们以确定表示文件的字节数并保持读取文件直到它达到这个数字。然后,它开始等待另外8个字节。