【问题标题】:Socket Programming -Java - Many Clients One Socket Question(s)Socket 编程 -Java - 许多客户端一个 Socket 问题
【发布时间】:2009-11-12 04:02:22
【问题描述】:

基本上我试图让许多 java 客户端连接到我的 ColdFusion 服务器上的套接字(使用套接字网关)。然而,在我开始编写代码之前,我对套接字及其性能有点困惑。首先,套接字是否意味着许多(1000+)客户端连接到一台服务器上的一个套接字(比如端口 2202)?如果所有等待的基本上是一个 ping,或者当这些客户端收到这个“ping”时,他们可以去获取一些新数据,那么性能如何。

谢谢, 费萨尔·阿比德

【问题讨论】:

    标签: java android coldfusion


    【解决方案1】:

    套接字由以下元组标识,

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

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

    使用阻塞 I/O 维护 1000 个套接字将很困难,这通常意味着 1000 个线程。你需要使用蔚来。我们有一个用Mina 编写的服务器,它可以处理峰值2000 个连接。

    【讨论】:

      【解决方案2】:

      首先,套接字是用于 许多(1000+)个客户端连接到一个 一台服务器上的套接字(比如端口 2202)

      是的,您的服务器将在端口 2202 上打开一个套接字,并且 1000 客户端将连接到它。 服务器打开服务器套接字,客户端打开客户端套接字,这不同。

      如果都在那里,性能如何 等待基本上是一个ping,或者 这样的事情,当这些客户 收到这个“ping”,他们可以去获取 一些新数据

      在服务器端,你使用getInputStream函数从客户端获取数据,使用getOutputStream函数向客户端发送数据。

      注意:你应该使用线程来处理客户端的每个请求

      【讨论】:

      • 当我向客户端发送数据时,它是发送给一个特定的客户端还是每个客户端?
      • 这取决于您的需求,如果您配置发送给所有,它将发送给所有。如果要将数据发送到指定的客户端,它将发送到该客户端。
      【解决方案3】:

      许多使用阻塞 I/O 的套接字客户端没有任何问题(您可以查看this article 了解更多信息)。但是,这里还有另一种方法可以更好地满足您的需求:

      【讨论】:

        【解决方案4】:

        您好,使用简单的 java socket 编程同时连接 1000 个客户端并不是完美的方法。问题是在fedora linux中默认的最大文件数是1024,而在windows中是2048或类似的东西。因此,在您的服务器端,您会发现打开了 1000 多个文件,之后如果客户端继续增加,那么您会发现打开的文件过多错误。所以更好的方法是使用非阻塞套接字编程(我的意思是使用 SocketChannel)同时使用套接字通道,根据我的检查,我们可以毫无问题地连接 20,000 个客户端。

        所以最好使用 nio。 Oreilly 出版的 java nio 有一本非常好的书。 我用过java nio(socket channel)

        谢谢 苏尼尔·库马尔·萨胡

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 2014-10-19
          • 1970-01-01
          • 2013-09-25
          • 1970-01-01
          • 2012-06-18
          • 1970-01-01
          相关资源
          最近更新 更多