Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于java套接字的大型文件传输_Java_Android_Sockets_Large Files - Fatal编程技术网

基于java套接字的大型文件传输

基于java套接字的大型文件传输,java,android,sockets,large-files,Java,Android,Sockets,Large Files,我已经编写了一个用于传输小文件的小客户机-服务器代码。它使用数据输出流和数据输入流的readFully()方法。由于明显的原因,此代码不适用于较大的文件。我在考虑在将大文件发送到客户机之前,将它们分割成1Kb的小块。但我想不出任何解决方案(比如如何在数据输出流上以正确的偏移量写入多个数据块,以及如何在接收端重新组装它们)。有人能提供解决方案吗?如果您能修改我的代码,这将非常有帮助: 发件人(服务器): 请帮忙!提前谢谢!:)你说得对,这是一个糟糕的方法。它既浪费记忆又浪费时间;它假定文件大小为3

我已经编写了一个用于传输小文件的小客户机-服务器代码。它使用数据输出流和数据输入流的readFully()方法。由于明显的原因,此代码不适用于较大的文件。我在考虑在将大文件发送到客户机之前,将它们分割成1Kb的小块。但我想不出任何解决方案(比如如何在数据输出流上以正确的偏移量写入多个数据块,以及如何在接收端重新组装它们)。有人能提供解决方案吗?如果您能修改我的代码,这将非常有帮助:

发件人(服务器):


请帮忙!提前谢谢!:)

你说得对,这是一个糟糕的方法。它既浪费记忆又浪费时间;它假定文件大小为32位;它假定整个文件都可以放入内存中;它假定在一次读取中读取整个文件;在读取整个文件之前,它不会发送任何内容

在Java中复制流的规范方法如下:

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}

它将与任何大小的缓冲区,你喜欢,因此与任何大小的文件,你可以想出。在两端使用相同的代码,尽管不必在两端使用相同大小的缓冲区。当您通过网络进行复制时,您可能会认为1k或1.5k是最佳大小,但这忽略了内核中套接字发送和接收缓冲区的存在。考虑到这些因素,最好使用8k或更多。我终于解决了这个问题。这是我为服务器和客户端修改的源代码。希望这也能帮助其他人!:) 服务器端代码段(发件人):

客户端代码段(接收器):

写入输出流的更快方式:

long acc=0;
long N=myFile.length();
 while(acc<N){
            noofbytes=dis.read(mybytearray, 0, 16384);
            dos.write(mybytearray, 0, noofbytes);
            acc=acc+noofbytes; } dos.flush();
long acc=0;
long N=myFile.length();

while(请看这里,Thanx!让我重新编写代码!将返回结果给您)::我尝试了上述方法,但收到的文件不完整。我不知道如何在接收端重新组装数据包。你能按照你的建议修改发送者和接收者代码吗?我的思维完全被阻塞了,似乎什么都不起作用(你不必“在接收者处重新组装数据包”。只需将它们写入你的文件。两端的代码相同。我已经说过了。@Markisoflorne当50%传输完成时,服务器关闭。我不知道为什么,但在50%时,每个文件的计数值为-1。请帮助。我尝试了上述方法,但收到的文件被报告了(比原始文件大)。请帮帮我。我已经被困一个多月了。很抱歉英语不好。此代码不起作用。你毫无意义地用writeLong()编写缓冲区大小但是从来没有读过它,所以你将额外的8字节写入文件。你也不需要将/(的)增加一倍。它的其余部分基本上与我的答案相同,没有得到确认。好吧,你是对的,我写文件大小是毫无意义的,我出于测试目的包含了它,但忘记了删除它。但是对于代码的其余部分,它工作得非常好。事实上,我已经设计了一种新的解决方案,用于写入输出流,速度更快。你可以参考编辑部分。你在做梦。我几周前给了你工作代码。唯一可以加快速度的方法是使用更大的缓冲区。你的编辑是无效的。将读取限制为16384字节不会产生任何效果它会更快。如果可以的话,你应该让它填充输入缓冲区。不测试-1是绝对不安全的:你有可能用该代码得到
ArrayIndexOutOfBoundsException
,也有可能得到一个不正确的“acc”值,这将导致
while
条件发生故障。你只会让情况变得更糟。你我也没有修复
/
s。你能解释一下吗?“你有可能用该代码获得ArrayIndexOutOfBoundsException,也有可能获得不正确的'acc'值,这将导致while条件发生错误。”?noofbytes将始终返回实际读取的数据量(没有垃圾)。在最大值时,缓冲区最多可以读取16K,但最终如果剩余大小小于16K,noobbytes将返回实际读取的字节数。而且,是的!我对不同的缓冲区大小进行了比较,发现16K在我的情况下工作得最好(1 GHz双核,1 GB RAM)使用clientData.readLong();对于文件大小,您的代码运行良好,非常感谢:)
while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
final File myFile= new File(filePath); //sdcard/DCIM.JPG
    byte[] mybytearray = new byte[8192];
    FileInputStream fis = new FileInputStream(myFile);  
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);
    OutputStream os;
    try {
        os = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF(myFile.getName());     
        dos.writeLong(mybytearray.length);
        int read;
        while((read = dis.read(mybytearray)) != -1){
            dos.write(mybytearray, 0, read);
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
int bytesRead;
    InputStream in;
    int bufferSize=0;

    try {
        bufferSize=socket.getReceiveBufferSize();
        in=socket.getInputStream();
        DataInputStream clientData = new DataInputStream(in);
        String fileName = clientData.readUTF();
        System.out.println(fileName);
        OutputStream output = new FileOutputStream("//home//evinish//Documents//Android//Received files//"+ fileName);
        byte[] buffer = new byte[bufferSize];
        int read;
        while((read = clientData.read(buffer)) != -1){
            output.write(buffer, 0, read);
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
long acc=0;
long N=myFile.length();
 while(acc<N){
            noofbytes=dis.read(mybytearray, 0, 16384);
            dos.write(mybytearray, 0, noofbytes);
            acc=acc+noofbytes; } dos.flush();