我进行了很多研究,但找不到适合该主题的任何东西,因此在这里提出问题。

我想使用Java套接字构建一个类似Dropbox的应用程序,并使用一个社交媒体网站,将我们在共享文件夹上上传的文件自动下载或同步到我们在社交媒体网站中添加的所有朋友系统上。

到现在为止,我一直以为我将运行一台服务器,并且每次客户端连接(登录)时,我将启动2个处理程序,其中1个用于上传,1个用于下载。 DOWNLOAD处理程序将每5分钟从我所有的朋友那里检查一个新文件(这意味着他们在共享目录中添加了新文件),并将对其进行同步。 当处理器从客户端接收到文件时,UPLOAD处理程序会将文件上传到服务器上,并以字节数组形式发送。 客户端使用目录监视程序将数据发送到服务器,以跟踪目录中的更改。

现在的问题是每个客户端启动2个线程,是否可行? 我认为这将严重降低服务器的速度,因为我想像有100个客户这样说,这意味着200个线程。 你们能为我指出应该采取什么方法的正确方向吗?我读到有关NIO和IO的消息后感到困惑。 另外,有没有什么特别的库对您有帮助? 我看了Netty和Apache Mina,但不了解它们如何对您有所帮助。

提前致谢 :)

#1楼 票数:1 已采纳

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

#2楼 票数:0

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

如果您想了解更多信息,请查看我的Socket编程教程 第三部分介绍如何设置非阻塞变体,它应该为您提供入门所需的一切。 如果您仍有疑问,请告诉我,我会尽快帮助您。

  ask by Sneh translate from so

未解决问题?本站智能推荐:

1回复

与数据报套接字相比,使用数据报通道有什么优势

我正在尝试优化UDP服务器以处理更大的吞吐量,它基于Java IO数据报套接字(不是NIO)。 当此UDP服务器收到UDP数据包时,它需要处理此数据包,并将处理后的数据发送到后台资源,然后响应客户端。 当前,该服务器将为每个要处理的传入数据包分配一个线程。 我读过一些文章,我了解某些情
1回复

在Java IO和NIO中测量套接字缓冲区

我编写了一个简单的设置代码:客户端连接到服务器,服务器开始发送字节,客户端读取字节,但有1秒的延迟。 我有2种实现方式:使用Java IO和Java NIO。 通过打印服务器发送的字节数和客户端打印的字节数,我尝试测量系统中客户端缓冲区的大小。 当然,我通过socket.getReceiv
1回复

Java Windows将字节写入文件,有些不正确[重复]

这个问题已经在这里有了答案: 文件通道读取/添加了错误的数据 1个答案 我的目标是将字节流从套接字读取到文件中,然后在以后播放它作为我的应用程序的测试工具。 在将字节写入磁盘的某个地方,一个字节将被错误地写入,似乎是随机的。 我的作家看起来像这样:
2回复

使用Javanio从阻塞I / O转变为非阻塞I / O

我修改了这段代码如何在套接字通道中发送和接收序列化的对象我的实时模拟发送对象,但是我一次又一次地遇到异常是因为此代码本质上是阻塞的,因此如何使用javanio将该代码转换为非阻塞 客户:这不断将寻找来自服务器的回复 当服务器必须保持连接客户端并将仿真状态同时发送到已连接的客户端时
1回复

Java中非阻塞写入的顺序

Java的NIO提供了许多有用的功能。 其中之一是可以不阻塞通道上的写操作。 这意味着在完成写入之前,write方法将不会阻塞。 但是,即使方法没有阻塞,是否仍然提供所有写入的顺序与调用写入的顺序相同?
2回复

通过java.nio通道发送字符串无法正常工作

这就是我尝试过的: 服务器: 客户: 另一边似乎只是得到一个非常长而空的字符串,我无法弄清楚我做错了什么。 更新 :我更新了我的代码,发现服务器正在写0字节。 有些字节要写,所以sc.write()为什么不写任何东西? 更新2 :借助Vishal的帮助,我们终
10回复

每个客户一个线程。可行?

我正在编写一个Java服务器,它使用普通套接字来接受来自客户端的连接。 我正在使用相当简单的模型,其中每个连接在阻塞模式下都有自己的线程读取。 伪代码: (线程是从Executors.newCachedThreadPool()创建的,因此启动它们不会有任何重大开销) 我知道这是
1回复

为什么多线程I / O的AsynchronousFileChannel抛出java.nio.file.FileSystemException?

我想拥有一个类,其中来自不同线程的实例将写入或读取同一文件。 下面几乎是写操作,但是我得到了java.nio.file.FileSystemException 。 我正在使用2个实例作为普通的多线程访问,但是我无法使其正常工作 编辑: 堆栈跟踪: java.nio.fil