python - 使用线程或 asycore 在 python 中群聊应用程序

标签 python multithreading sockets asynchronous

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

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

最佳答案

对于群聊应用,一般的做法是:

服务器端(接受过程):

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

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

  • 应用程序运行时:
    • 读取传入的消息,并将其存储到队列或其他东西中。
    • 继续

服务器端(群聊处理):

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

客户端:

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

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

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

关于python - 使用线程或 asycore 在 python 中群聊应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11725192/

相关文章:

python - 裁剪出字符串的一部分并使用正则表达式打印

Python 正则表达式 : Alternation for sets of words

multithreading - go指针多线程读写错误

Python多线程服务器一次可以处理一个客户端消息

sockets - Nginx 和 Flask-socketio Websockets : Alive but not Messaging?

sockets - 让socket.io客户端版本落后于服务器版本

python - Python中的平均计算

python - 单元测试中未调用 load_tests()

c++ - 同时等待条件 (pthread_cond_wait) 和套接字更改 (select)

java - java 套接字中收到的延迟响应