2

我正在设计一个应用程序,其中许多客户端连接到中央服务器。该服务器保持这些连接,每半小时发送一次保持连接。服务器有一个嵌入式 HTTP 服务器,它为客户端连接提供接口(例如http://server/isClientConnected?id=id)。我想知道解决此问题的最佳方法是什么。我目前的实现是在Java中,我只有一个以ID为键的Map,但是为每个连接启动一个线程,我不知道这是否真的是最好的方法。任何指针将不胜感激。
谢谢,
艾萨克·沃勒

4

4 回答 4

6

使用 java.nio 包,如本页所述:使用 Java NIO 构建高度可扩展的服务器。另请仔细阅读此页面:高度可扩展的基于 NIO 的服务器的体系结构

就个人而言,我不会为 NIO 内部而烦恼,而是使用像Apache MINAxSocket这样的框架。NIO 很复杂,很容易以非常晦涩的方式出错。如果您希望它“正常工作”,请使用框架。

于 2009-06-28T19:17:09.627 回答
3

每个连接只有一个线程,通常可以在单台机器上扩展到大约 10,000 个连接。对于 Windows 32 机器,您可能会遇到大约 1,000 个连接的限制。

为避免这种情况,您可以更改程序的设计,也可以横向扩展(水平)。您必须权衡开发成本和硬件成本。

每个用户的单个线程,具有单个连续连接通常是最简单的编程模型。我会坚持使用这个模型,直到你达到当前硬件的极限。那时,我会决定要么更改代码,要么添加更多硬件。

于 2009-06-29T07:38:47.903 回答
2

如果客户端将长时间连接,则为每个客户端分配一个线程可能会出现问题。服务器上的每个线程都需要一定数量的资源(例如堆栈的内存)。

您可以使用Jetty Continuations通过使用异步 servlet 以更少的线程来处理客户端请求。

于 2009-06-28T18:55:18.687 回答
0

阅读有关反应堆模式的更多信息。在 Java 中有一个实现(它使用通道而不是客户端的线程)。它易于实施且非常有效。

于 2012-05-14T20:18:01.447 回答