Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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程序赢得';t传输大于64KB的文件_Java_Sockets_Limit_File Transfer - Fatal编程技术网

Java程序赢得';t传输大于64KB的文件

Java程序赢得';t传输大于64KB的文件,java,sockets,limit,file-transfer,Java,Sockets,Limit,File Transfer,我正在制作一个程序,将文件从服务器发送到客户端。程序本身运行,适用于64KB及以下的任何文件,但当我尝试发送一个大于64KB的文件时,它只传输64KB,例如,我尝试发送一个232KB的文件test.txt,程序只输出一个64KB的文件receivedTest.txt 这是服务器代码 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOEx

我正在制作一个程序,将文件从服务器发送到客户端。程序本身运行,适用于64KB及以下的任何文件,但当我尝试发送一个大于64KB的文件时,它只传输64KB,例如,我尝试发送一个232KB的文件test.txt,程序只输出一个64KB的文件receivedTest.txt

这是服务器代码

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 FileTransferServer {

public static void main(String[] args) throws IOException {
    ServerSocket servsock = new ServerSocket(1234);
    File myFile = new File("C:/Users/Owner/Downloads/test.txt");
    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();
    }
}
}
这是客户

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

public class FileTransferClient {
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 1234);
byte[] mybytearray = new byte[409600];
InputStream is = sock.getInputStream();

FileOutputStream fos=newFileOutputStream("C:/Users/Owner/Downloads/receivedTest.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    int bytesRead = is.read(mybytearray, 0, mybytearray.length);
    bos.write(mybytearray, 0, bytesRead);
    bos.close();
    sock.close();
  }
}
如果您不知道发生了什么,我们将不胜感激

编辑:谢谢大家,现在可以使用了,我将客户端代码更改为:

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

public class FileTransferClient {
  public static void main(String[] argv) throws Exception {
    Socket sock = new Socket("127.0.0.1", 1234);
    byte[] mybytearray = new byte[1024];
    int count;
    InputStream is = sock.getInputStream();
    FileOutputStream fos = new FileOutputStream("C:/Users/Owner/Downloads/receivedTest.jpg");
    BufferedOutputStream bos = new BufferedOutputStream(fos);

    while ((count = is.read(mybytearray)) > 0)
    {
        bos.write(mybytearray, 0, count);
    }
    bos.close();
    sock.close();
  }
}
常见问题

  • 您假设该文件适合内存
  • 您假设文件大小适合整数
  • 您假设
    read()
    填充了缓冲区
  • java中复制流的规范方法如下:

    byte[] buffer = new byte[8192]; // any size greater than 0 will work
    int count;
    while ((count = in,read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    我很惊讶你能从你的代码中得到64k。如果没有循环,您只会得到一个套接字接收缓冲区已满,在Windows上可能低至8k。

    您尝试的方式将给您OutOfMemoryError,因为您正在尝试将整个文件读取到内存中,直到它被发送,这完全不必要


    最好的方法是读写块,就像您在接收代码中所做的那样。

    您不应该一次写入整个内容,尤其是不应该写入套接字。你想做一些类似于

    byte[] buf = new byte[4096];
    int bytesRead = 0;
    while((bytesRead = is.read(buf)) > 0){
        os.write(buf, 0, bytesRead);
    }
    

    通过这种方式,您可以读取/写入任意大小的文件,而不会出现错误,也不会担心内存不足或向服务器发送过大请求时出错。

    您是否尝试过将文件分块写入/读取,而不是作为一个整体写入/读取?另外,当文件超过400kb时会发生什么?您知道
    是.read
    不会读取整个数组,对吗?它读取“1和mybytearray.length之间的任意字节数”。与服务器上的
    bis.read
    相同。(
    write
    的工作方式与您预期的一样,并且写下了全部内容)我希望您能解释一下这些否决票。这一个。他的接收代码中没有循环,但是说OP必须读写块并没有错。没有别的办法。这是一个很好的建议,但显然不是问题的答案。将整个文件读入内存是否是一个好主意完全取决于文件大小,而在小文件大小上耗尽内存的可能性很小。@正确地说,PeterWalser将文件分块读写是问题的答案。谢谢,它起到了作用,我将客户端代码改为这个,它能够传输160KB的文件。