使用Java套接字将大文件传输到多个客户端的最佳方法

时间:2015-03-30 20:50:09

标签: java multithreading sockets io nio

我已经研究了很多,但在这个主题上找不到任何合适的东西,因此在这里提问。

我想使用java套接字构建一个像Dropbox这样的应用程序,并在社交媒体网站上自动下载或同步我们在社交媒体网站上添加的所有朋友系统。

到目前为止我所想的是我将运行一个服务器,每次客户端连接(登录)我将启动2个处理程序,1个用于上传,1个用于下载。 DOWNLOAD处理程序将每5分钟检查一次来自我所有朋友的新文件(意味着他们在共享目录中添加了新文件),并将同步它。当处理程序从客户端接收文件时,UPLOAD处理程序将上传服务器上的文件作为字节数组发送。客户端使用目录观察器将数据发送到服务器以跟踪目录中的更改。

现在的问题是每个客户端启动2个线程,是否可行?我认为它会严重降低服务器的速度,因为我会想象有100个客户端说,它意味着200个线程。你们能不能指出我应该采取什么样的方法正确的方向,我读到了关于NIO和IO并且感到困惑。还有什么特别的图书馆可以提供帮助吗?我看着Netty,apache mina,但不明白他们是如何帮助的。

提前致谢:)

2 个答案:

答案 0 :(得分:1)

我建议您查看有关NIO的文章:https://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html。如果服务器发送文件,还要考虑可扩展性......硬盘的速度是多少?我认为,这比线程数更重要;但要注意线程锁定。 你为什么要实现网络做得好的东西?如果我是你,我会尝试考虑一个安全的代理,而不是处理字节的所有东西。即使您想要传输多个部分的文件,也可以使用multipart zip文件并以编程方式下载每个部分,然后重建该文件。通过这种方法,您可以重用Web和客户端的基础架构;您也可以从现代Web服务器的高IO吞吐量中受益。

答案 1 :(得分:0)

当您认为您将拥有大量客户端时,使用标准Socket和ServerSocket是行不通的。正如您已经指出的那样,每个客户端需要2个线程。最终,这将耗尽您的所有服务器资源。你需要的是java.nio包。在那里你会发现SocketChannel和ServerSocketChannel。通过这些,您可以设置非阻塞套接字通信。这种类型的通信是基于事件的。这意味着您可以让多个客户端在服务器上使用相同的2个线程进行读写。

如果您想了解更多信息,请查看我的Socket programming tutorial。第三部分是设置一个非阻塞变体,它应该为您提供入门所需的一切。如果您仍有疑问,请告诉我,我会看看能不能帮助您。