Socket编程 - Java - 多个客户端一个Socket问题

3
基本上,我正在尝试让许多Java客户端连接到我的ColdFusion服务器上的套接字(使用Socket网关)。但是,在我开始编写代码之前,我对套接字及其性能有些困惑。首先,套接字是否适用于许多(1000+)客户端连接到一个服务器上的一个套接字(例如端口2202)?如果所有等待的只是基本的ping或类似的东西,那么它的性能如何,以便这些客户端在接收到这个“ping”时可以获取一些新数据。
谢谢, Faisal Abid
4个回答

6

Socket是通过以下元组进行标识的:

  1. 源IP
  2. 源端口
  3. 目标IP
  4. 目标端口
  5. 协议(TCP或UDP)

即使1000个客户端都连接到同一个端口(目标端口),每个客户端也将获得自己的套接字,因此你将有1000个打开的套接字。

使用阻塞I/O来维护1000个套接字通常意味着需要1000个线程,这将会非常困难。你需要使用 NIO。我们使用 Mina 编写了一个服务器,可以处理最多2000个连接。


2
首先,套接字是否适用于1000多个客户端连接到一个服务器上的一个套接字(比如端口2202)?
是的,您的服务器将在端口2202上打开一个套接字,并且1000个客户端将连接到它。服务器会打开服务器套接字,而客户端将打开客户端套接字,两者不同。
如果所有客户端等待的只是基本上的ping(或类似ping的操作),性能如何?当这些客户端收到这个“ping”时,他们可以获取一些新数据。
在服务器上,您应该使用getInputStream函数从客户端获取数据,并使用getOutputStream函数向客户端发送数据。
注意:您应该使用线程来处理每个客户端的请求。

当我向客户端发送数据时,它会发送到特定的一个客户端还是每个客户端都会收到? - Faisal Abid
这取决于您的需求,如果您配置为发送给所有人,则会发送给所有人。如果您想将数据发送到指定的客户端,则会发送到该客户端。 - misamap

1

许多使用阻塞 I/O 的套接字客户端并没有什么问题(您可以查看this article以获取更多信息)。然而,这里有其他方法可以更好地满足您的需求:


0

嗨,使用简单的Java套接字编程一次连接1000个客户端,并不是最完美的方法。问题是,在Fedora Linux中,默认的最大打开文件数是1024,在Windows中是2048或类似的数值。因此,在服务器端,你会发现打开超过1000个文件,之后如果客户端继续增加,你将会遇到太多打开文件的错误。所以更好的方式是使用非阻塞套接字编程(我的意思是使用SocketChannel)。根据我的检查,使用SocketChannel同时可以连接20000个客户端而无任何问题。

所以最好使用NIO。有一本非常好的关于Java NIO的O'Reilly出版物。我已经使用过Java NIO(Socket Channel)。

谢谢 Sunil Kumar Sahoo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接