我需要将桌面应用程序作为文件服务器的一部分,该文件服务器应尽可能快地响应文件传输请求(来自远程客户端,通常位于同一LAN上)。小型文件会有很多文件请求。服务器应该能够提供上传和下载服务。
我对任何特定技术都不苛求所以我对任何编程语言,工具包,库都是开放的,只要它们可以在Windows上运行。
我最初的想法是使用Windows套接字进行C / C ++实现,或者使用Boost(asio等)等库提供的服务。我也想过Erlang,但我必须学习,所以性能优势应该证明由于必须学习语言而增加开发时间。
LATER EDIT:我很欣赏使用FTP或HTTP或基本上已经创建的任何内容的答案,但考虑到你仍想从头开始编写,你会做什么?
答案 0 :(得分:5)
为什么不和FTP一起去?您应该能够找到任何语言的适当服务器实现,以及客户端访问库。
听起来好像很多车轮改造。当然,FTP并不理想,并且有一些奇怪的地方,但......它就在那里,它是标准的,众所周知的,并且已经广泛实施。
答案 1 :(得分:3)
对于频繁上传的小文件,最快的方法是实现自己的专有协议,但这需要大量的工作 - 而且它也是非标准的,这意味着未来的整合将很困难,除非你是能够在您支持的任何客户端中实现您的协议。无论如何你选择这样做,这是我对一个简单协议的建议:
这可以在简单的TCP套接字上实现。您也可以使用UDP,避免建立连接的成本,但在这种情况下,您必须处理重新传输控制。
在决定实现自己的协议之前,先看一下像libcurl这样的HTTP库,你可以让你的服务器使用标准的HTTP命令,如GET下载和POST上传。这将节省大量工作,您将能够使用任何Web浏览器测试下载。
提高性能的另一个建议是使用文件存储库而不是文件系统,而是像SQLite一样。您可以创建一个表,其中包含一个用于文件名的char列和一个用于文件内容的blob列。由于SQLite是轻量级的并且可以进行有效的缓存,因此您大部分时间都可以避免磁盘访问开销。
我假设您不需要客户端身份验证。
最后:虽然C ++是你倾向于给你原始的本机代码速度,但很少这是这种应用程序的主要瓶颈。最有可能是磁盘访问和网络带宽。我之所以提到这一点,是因为在Java中,您可能能够使用少于100行代码使servlet执行完全相同的操作(使用HTTP GET进行下载,POST进行上载)。在这种情况下使用Derby而不是SQLite,将该servlet放在任何容器(Tomcat,Glassfish等)中并完成。
答案 2 :(得分:2)
如果所有计算机都在同一LAN上的Windows上运行,为什么还需要服务器?为什么不简单地使用Windows文件共享?
答案 3 :(得分:2)
我建议不要使用FTP,SFTP或任何其他面向连接的技术。相反,请选择无连接协议或技术。
原因是,如果您需要上传或下载大量小文件,并且响应应该尽可能快,您希望避免设置和销毁连接的成本。
我建议您查看使用现有实现或实现自己的HTTP或HTTPS服务器/服务。
答案 4 :(得分:2)
您的瓶颈很可能来自以下某个来源:
硬盘I / O - WD velociraptor应具有大约100MB / s的随机访问速度。此外,重要的是将其设置为RAID0,1,5还是什么不是。有些读取速度快但写入速度慢。权衡。
网络I / O - 假设您在快速RAID设置中拥有最快的硬盘,除非您使用Gbit I / O,否则您的网络速度会很慢。如果你的管道很大,你仍然需要提供数据。
内存缓存 - 内存中的文件系统缓存需要足够大,以缓冲所有网络I / O,这样才不会降低速度。这将需要大量的内存来处理你正在寻找的工作。
文件系统结构 - 假设你有几千兆字节的内存,那么瓶颈很可能就是你用于文件系统的数据结构。如果文件系统结构很麻烦,那么会让你失望。
假设所有其他问题都已解决,那么您是否担心应用程序本身。请注意,大多数瓶颈都在软件控制之外。因此,无论您是使用C / C ++编写代码还是使用特定的库,您仍将受操作系统和硬件的支配。
答案 5 :(得分:1)
听起来你应该使用SFTP (SSH) server,它的防火墙/ NAT安全,安全,并且已经做了你想做的事情和更多。您还可以使用SAMBA或Windows文件共享来实现更简单的实现。
答案 6 :(得分:1)
为什么不使用现有的东西,例如普通的Web服务器可以非常快速地处理很多小文件(图像)。
许多人已经花时间优化代码。
第二个好处是传输是通过HTTP完成的,HTTP是已建立的协议。如果您需要更高的安全性,可以轻松切换到SSL。
对于上传,脚本或自定义模块也没有问题 - 使用相同的方法也可以添加授权。
只要您不需要动态搜索文件,我猜这将是最佳解决方案之一。
答案 7 :(得分:0)
这是现有桌面应用程序的新部分吗?服务器的目标是什么?它是保护上传/下载的文件并提供身份验证和/或授权吗?它是否为上传存储提供某种结构?
一种选择可能是在机器上安装Apache HTTP Server并通过它提供文件。使用POST上传和GET下载。
如果客户在局域网内,您是否可以共享一个驱动器?