【问题标题】:Can't send large files with sockets无法使用套接字发送大文件
【发布时间】:2016-01-22 11:14:08
【问题描述】:

我正在尝试创建一个发送文件的服务器客户端结构,但是当我发送大小超过 200 MB 的大文件时遇到问题。 我使用ObjectOutputStream 和我自己的对象发送它们,该对象具有字节数组中的文件,并且我想使用Apache commons 库将其保存在其中。

客户端发送方法

try{
        Socket s = new Socket(ip, serverPort);

        ObjectOutputStream output = new ObjectOutputStream(s.getOutputStream());

        FileInputStream file = new FileInputStream(ClientFilePath+"\\"+ClientFileName);

        datainBytes = IOUtils.toByteArray(file);

        Packet paquete = new Packet(datainBytes,ServerFileDirectory,ClientFileName);

        output.writeObject(paquete);
        output.close();

    } catch (ConnectException e){
        //noinspection MagicConstant
        JOptionPane.showMessageDialog(contentPane,"Conexion perdida","ERROR",0);
    } catch(FileNotFoundException e){
        JOptionPane.showMessageDialog(contentPane,"No tienes permisos para movere este archivo","ERROR",0);
    } catch(IOException e) {
        e.printStackTrace();
    }

服务器接收方法

Packet paquete = null;

    try {

        //ClientIN is the input from the client initialized earlier
        paquete = (Packet) ClientIN.readObject();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    FileUtils.writeByteArrayToFile(new File(paquete.getFilePathDestiny()+"\\"+paquete.getFileName()), paquete.getData());

我遇到的确切问题是服务器正在尝试读取文件但挂起并且什么也不做。

【问题讨论】:

  • 你能发布ClientIN.readObject()方法吗?
  • @FrancescoPitzalis ClientIn 是 Client Socket 的 ObjectInputStream
  • 哦,好吧,这似乎是一个自定义静态方法

标签: java file sockets server


【解决方案1】:

如果您要发送对象,则使用对象/流通常是一个好主意。在这种情况下,您发送的文件可以逐步流式传输到服务器。如果您流式传输数据,它可以是任何大小,例如>> 2 GB。

我怀疑这只是需要很长时间,而不是挂起。对象/流是通用的,但对于大量数据来说速度不是很快。

【讨论】:

  • 我正在发送包含在数据数组中的对象数据包以及我想要保存它的方向,如果你想要我可以上传对象。
  • @IsmaelBlasco 您的大部分数据不是对象,而是文件的内容。最好将文件作为字节流逐步发送。这样文件的文件就不重要了。
  • 那么我应该如何流式传输数据?因为我实际上在做 sem 以通过内存限制
  • @IsmaelBlasco 您应该做的是一次读取文件的一部分,例如32 KB,并逐步将其写入套接字。在接收端,您可以在接收数据时读取数据并将其直接写入文件。这样,对于任何大小的文件,甚至是多 GB 的文件,您只需要 32 KB 的内存。 (如果太大,您可以减小缓冲区大小)这将适用于 ObjectStream,但稍后您应该找到一种方法来替换它以提高性能。
  • 谢谢你的解释我会试试的
猜你喜欢
  • 2017-03-15
  • 2012-07-12
  • 1970-01-01
  • 2012-07-12
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多