java - 在 Java 服务器应用程序中管理多个套接字连接

标签 java sockets

在我们的新项目中,我们需要实现一个服务器应用程序。此服务器获得 50,000(+) 个客户端的连接请求。问题是这些连接必须保持打开状态并且必须在某处进行管理。该应用程序应该像电话交换机一样工作。因此它可以获取已连接客户端的请求并将它们连接到其他(可能是几个)客户端,前提是它们也已连接。使用专有协议(protocol)。我的问题是:

如何(以及在​​哪里)管理打开的套接字?我应该把它们放在 HashMap 中吗?这对我来说听起来很好奇。但是我没有这么多开放连接的经验。

是否有支持此连接要求的可用框架?

感谢您的帮助!

最佳答案

How (and where) to manage the open sockets? Should I put them in a HashMap or something?

通常,每个套接字将由负责读取和写入套接字的线程管理。您还将拥有一个主线程,负责在预定义的网络接口(interface)和端口(使用 ServerSocket API 类)接收所有连接请求,然后可能会将实际处理工作移交给 worker/从属线程。在这种情况下,您应该为工作线程寻找一个线程池,因为创建 50k 线程很可能会使您的操作系统和硬件不堪重负。

此外,如果您确实要管理 50k 并发套接字,强烈建议使用 NIO API (java.nio.*) 而不是 Java 的普通 IO API,尽管我还没有看到太多需要超过 2-5k 的项目并发连接。 Java 世界中至少有两个已知的基于 NIO 的框架 - Apache MINAJBoss Netty .但是,我建议阅读 well written NIO tutorial , 在开始使用 NIO API 或 NIO 框架之前。

关于java - 在 Java 服务器应用程序中管理多个套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7411744/

相关文章:

java - 修补 Java 软件

python - 使用 Python 获取 TCP 套接字统计信息?

java - javap 是否缺少一些行号?

java - switch case语句中的java范围声明如何?

javascript - 如何将变量从路由传递到 server.js

java - 基于事件的网络

facebook - 套接字策略文件的端口843-用户的端口多久关闭一次?

node.js - 使用 NodeJS 发送到 ZeroMQ 云后端

java - 使用 xstream 生成子类从 xml 解码

java - hibernate 4 中的 org.hibernate.validator.InvalidValue