使用 java 套接字将大文件传输到多个客户端的最佳方法
Best approach for large file transfer to multiple clients using java sockets
我进行了很多研究,但找不到与该主题相关的任何内容,因此在这里提出问题。
我想使用 java 套接字构建一个类似 dropbox 的应用程序,以及一个社交媒体网站,我们上传到共享文件夹的文件会自动下载或同步到我们添加的所有好友系统社交媒体网站。
到目前为止,我的想法是我将拥有一个服务器 运行,每次客户端连接(登录)时,我将启动 2 个处理程序,1 个用于上传,1 个用于下载。下载处理程序将每 5 分钟检查一次来自我所有朋友的新文件(意味着他们在共享目录中添加了新文件)并同步它。当处理程序从客户端接收到文件时,UPLOAD 处理程序会将文件上传到服务器,将其作为字节数组发送。客户端使用目录观察器将数据发送到服务器以跟踪目录中的更改。
现在的问题是每个客户端启动2个线程,是否可行?我认为它会严重降低服务器速度,因为我想象有 100 个客户端可以说,这意味着 200 个线程。你们能不能给我指出正确的方向,告诉我应该采取什么方法,我读到了 NIO 和 IO,然后感到困惑。还有什么特别的图书馆可以提供帮助吗?我查看了 Netty、apache mina,但不明白它们有什么用。
提前致谢:)
我建议你看看这篇关于 NIO 的文章:https://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html。还要考虑可伸缩性,如果您的服务器发送文件……您的硬盘驱动器的速度是多少?我认为这比线程数更重要;但要注意线程锁。
为什么要实现 Web 制作得如此出色的东西?如果我是你,我会尝试考虑一个比处理字节的所有东西更好的安全代理。即使你想分多个部分传输文件,你也可以使用多部分 zip 文件并以编程方式下载每个部分,然后重建文件。通过这种方法,您可以为 Web 和客户端重用您的基础架构;您还可以受益于现代 Web 服务器的高 IO 吞吐量。
当您认为您将拥有大量客户端时,使用标准 Socket 和 ServerSocket 是行不通的。正如您已经指出的那样,每个客户端需要 2 个线程。最终,这将耗尽您所有的服务器资源。您需要的是 java.nio 包。在那里你会找到 SocketChannel 和 ServerSocketChannel。通过这些你可以建立非阻塞套接字通信。这种类型的通信是基于事件的。这意味着您可以让多个客户端在服务器上使用相同的 2 个线程进行读写。
如果您想了解更多信息,请查看我的Socket programming tutorial。第三部分介绍了设置非阻塞变体,应该会为您提供入门所需的一切。如果您还有疑问,请告诉我,我会看看是否可以进一步帮助您。
我进行了很多研究,但找不到与该主题相关的任何内容,因此在这里提出问题。
我想使用 java 套接字构建一个类似 dropbox 的应用程序,以及一个社交媒体网站,我们上传到共享文件夹的文件会自动下载或同步到我们添加的所有好友系统社交媒体网站。
到目前为止,我的想法是我将拥有一个服务器 运行,每次客户端连接(登录)时,我将启动 2 个处理程序,1 个用于上传,1 个用于下载。下载处理程序将每 5 分钟检查一次来自我所有朋友的新文件(意味着他们在共享目录中添加了新文件)并同步它。当处理程序从客户端接收到文件时,UPLOAD 处理程序会将文件上传到服务器,将其作为字节数组发送。客户端使用目录观察器将数据发送到服务器以跟踪目录中的更改。
现在的问题是每个客户端启动2个线程,是否可行?我认为它会严重降低服务器速度,因为我想象有 100 个客户端可以说,这意味着 200 个线程。你们能不能给我指出正确的方向,告诉我应该采取什么方法,我读到了 NIO 和 IO,然后感到困惑。还有什么特别的图书馆可以提供帮助吗?我查看了 Netty、apache mina,但不明白它们有什么用。
提前致谢:)
我建议你看看这篇关于 NIO 的文章:https://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html。还要考虑可伸缩性,如果您的服务器发送文件……您的硬盘驱动器的速度是多少?我认为这比线程数更重要;但要注意线程锁。 为什么要实现 Web 制作得如此出色的东西?如果我是你,我会尝试考虑一个比处理字节的所有东西更好的安全代理。即使你想分多个部分传输文件,你也可以使用多部分 zip 文件并以编程方式下载每个部分,然后重建文件。通过这种方法,您可以为 Web 和客户端重用您的基础架构;您还可以受益于现代 Web 服务器的高 IO 吞吐量。
当您认为您将拥有大量客户端时,使用标准 Socket 和 ServerSocket 是行不通的。正如您已经指出的那样,每个客户端需要 2 个线程。最终,这将耗尽您所有的服务器资源。您需要的是 java.nio 包。在那里你会找到 SocketChannel 和 ServerSocketChannel。通过这些你可以建立非阻塞套接字通信。这种类型的通信是基于事件的。这意味着您可以让多个客户端在服务器上使用相同的 2 个线程进行读写。
如果您想了解更多信息,请查看我的Socket programming tutorial。第三部分介绍了设置非阻塞变体,应该会为您提供入门所需的一切。如果您还有疑问,请告诉我,我会看看是否可以进一步帮助您。