2

我正在开发一个群聊应用程序来学习如何使用套接字、线程(也许)和 asycore 模块(也许)。我的想法是有一个客户端-服务器架构,这样当客户端连接到服务器时,服务器会向客户端发送其他连接列表(其他客户端“用户名”、IP 地址),然后一个人可以连接到一个或多个一个人,服务器将在客户端之间建立 P2P 连接。我有套接字部分工作,但服务器一次只能处理一个客户端连接。
处理多个连接的最佳、最常见、实用的方法是什么?每当我有新的连接进入服务器时,我是否创建一个新的进程/线程,然后将不同的客户端连接连接在一起,或者使用我理解的 asycore 模块,它使服务器将相同的数据发送到多个套接字(连接),我只需要规范数据的去向。

任何帮助/想法/建议将不胜感激。

4

1 回答 1

1

对于群聊应用程序,一般方法是:

服务器端(接受过程):

  • 创建套接字,将其绑定到一个众所周知的端口(并在适当的接口上)并监听
  • 虽然(app_running)
    • Client_socket = 接受(使用 serverSocket)
    • 产生一个新线程并将这个套接字传递给线程。该线程处理刚刚连接的客户端。
    • 继续,让服务器可以继续接受更多的连接。

服务器端客户端管理线程:

  • 而 app_running:
    • 读取传入的消息,并存储到队列或其他东西。
    • 继续

服务器端(群聊处理):

  • 对于所有连接的客户端:
    • 检查他们的队列。如果存在任何消息,请将其发送给所有连接的客户端(包括发送此消息的客户端 - 用作 ACK 类)

客户端:

  • 创建一个套接字
  • 通过 IP 地址和端口连接到服务器
  • 发送/接收。

以上可以有很多改进。就像服务器可以轮询套接字或在一组套接字上使用“选择”操作一样。从某种意义上说,这将使其高效,因为当有很多连接的客户端时,为每个连接的客户端拥有一个单独的线程将是过量的。(考虑每个线程约 1MB 的堆栈)。

PS:我还没有真正使用过asyncore模块。但我只是猜测,当您有大量连接的客户端并且处理量非常少时,您会注意到一些性能改进。

于 2012-07-30T16:29:00.493 回答