使用线程或asycore在python中组聊天应用程序

时间:2012-07-30 16:03:36

标签: python multithreading sockets asynchronous

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

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

1 个答案:

答案 0 :(得分:1)

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

服务器端(接受流程):

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

服务器端客户端mgmt线程:

    app_running时
    • 读取传入的消息,并存储到队列或其他内容。
    • 继续

服务器端(群聊处理):

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

客户方:

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

上面可以有很多改进。就像服务器可以轮询套接字或在一组套接字上使用“select”操作一样。这将使其高效,因为当有很多时,为每个连接的客户端设置一个单独的线程将是过量的。 (想想堆叠每个线程大约1MB)。

PS:我还没有真正使用asyncore模块。但是我只是猜测当你有很多连接的客户端和非常少的处理时,你会发现一些性能提升。