【问题标题】:How to implement file transfer with Java sockets?如何使用 Java 套接字实现文件传输?
【发布时间】:2010-04-21 07:22:24
【问题描述】:

我正在使用 Java 套接字实现聊天。我专注于一些功能,比如身份验证、一个人聊天和群聊。我正在考虑添加文件传输功能,我想知道这有什么好的做法。我应该在服务器上有单独的套接字,不同的端口只监听文件传输吗?现在我从服务器套接字获得的输入和输出流分别绑定到 Scanner 和 PrintWriter 对象,所以我发现很难将其用于文件传输。

非常感谢你们可以推荐或给我好的建议的任何模式。

谢谢,

泽口

【问题讨论】:

    标签: java file sockets chat transfer


    【解决方案1】:

    嗯,FTP 为每个文件传输创建一个新的套接字。请注意,可以在与用于聊天的端口相同的端口上建立连接,但使用不同的初始化对话框。

    【讨论】:

      【解决方案2】:

      如果您可以使用本机库来做到这一点,它会更快。除非有充分的理由,否则除非有充分的理由,否则使用可以解决所有问题的库。

      如果你真的需要用纯 Java 发送文件。这是基于我的一个旧项目的一种方法。但是请注意,有一些序列化开销,但是其中大部分可以通过使用讨论的 NIO 等效项来删除here,或者您可以稍微进一步并使用Zero Copy,它可以让您告诉操作系统将文件直接复制到没有任何中间副本的套接字。这仅适用于文件,而不适用于其他数据。

      您应该在单独的线程中执行此操作,以便在文件传输时聊天仍然有效。创建一个套接字并给它一些标准端口(您可以给它端口 0,它只是选择下一个可用端口,但是您需要将该信息发送给另一个接收者,因此仅使用标准端口更容易)。然后将你的文件分割成块并使用套接字传输它:

      //Send file (Server)
      //Put this in a thread
      Socket socket = new Socket(destinationIP, destinationPort);
      ObjectOutputStream sender = new ObjectOutputStream(socket.getOutputStream());
      sender.writeObject(dataToSend);
      
      //Receive File (Client)
      //Kick off a new thread to receive the file to preserve the liveness of the program
      ServerSocket serverSocket = new ServerSocket(ListenPort);
      socket = new Socket();
      while (true) {
              new Thread(new TCPReceiver(socket)).start();
      }
      
      //Receive file thread TCPReceiver(Socket socket)
      //Get the stream where the object is to be sent
      ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
      
      /*  Where type is the type of data you send... String or anything really...
          read part of the file into something and send it then at this end use the same data                                                       
          type to recieve it and it will magically pull the entire object across.
      */
      while(fileIsIncomplete){
          type recievedData = (type) objectInputStream.readObject();
          //Reconstruct file
      }
      

      希望这足以让您启动并运行快速文件发送器:)

      编辑:删除废话。添加了原生点和零复制提及。

      【讨论】:

      • 增加序列化的开销不可能使它比直接在 TCP 的“金属”上运行的 FTP 更快。
      • 如果纯 FTP 是可行的,那就是真的。鉴于它是一个 Java 应用程序,它可能需要在没有本机 FTP 库的机器上具有可移植性。当然,从我在没有一台锁定的 Windows 机器上的日期来看。因此,除非将一个捆绑在应用程序中,否则您不能假设本机可行性。自从我写这篇文章以来已经很久了,我不记得我所说的“提高 FTP 速度和效率”是什么意思......也许与我在编写该代码之前尝试的任何 lib 相比,因为那行没有意义......不过,它仍然是用于发送文件或纯 Java 中其他任何内容的有效代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2018-08-19
      相关资源
      最近更新 更多