我需要服务器向所有客户端发送消息(Python、套接字)

2024-01-10

这是我的服务器程序,它如何将从每个客户端接收到的数据发送到每个其他客户端?

import socket
import os
from threading import Thread
import thread

def listener(client, address):
    print "Accepted connection from: ", address

    while True:
        data = client.recv(1024)
        if not data:
            break
        else:
            print repr(data)
            client.send(data)

    client.close()

host = socket.gethostname()
port = 10016

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []

while True:
    print "Server is listening for connections..."
    client, address = s.accept()
    th.append(Thread(target=listener, args = (client,address)).start())

s.close()

如果您需要向所有客户端发送消息,则需要以某种方式保留所有客户端的集合。例如:

clients = set()
clients_lock = threading.Lock()

def listener(client, address):
    print "Accepted connection from: ", address
    with clients_lock:
        clients.add(client)
    try:    
        while True:
            data = client.recv(1024)
            if not data:
                break
            else:
                print repr(data)
                with clients_lock:
                    for c in clients:
                        c.sendall(data)
    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

将其中的一部分分解为单独的函数可能会更清楚,例如broadcast完成所有发送的函数。

无论如何,这就是simplest方法可以做到,但是有问题:

  • 如果一个客户端的连接速度很慢,其他人都可能会陷入写入该客户端的困境。当他们轮到写入时发生阻塞时,他们不会读取任何内容,因此您可能会溢出缓冲区并开始断开每个人的连接。
  • 如果一个客户端出现错误,则其线程正在写入该客户端的客户端可能会收到异常,这意味着您最终将断开错误的用户连接。

因此,更好的解决方案是为每个客户端提供一个队列,并在读取线程旁边提供一个为该队列提供服务的写入线程。 (然后,您可以通过各种方式扩展此功能 - 对队列进行限制,以便人们不再尝试与落后太多的人交谈,等等。)


As Anzel https://stackoverflow.com/users/3849456/anzel指出,有一个不同的除了每个客户端使用一个(或两个)线程之外设计服务器的方法:使用reactor http://en.wikipedia.org/wiki/Reactor_pattern多路复用所有客户端的事件。

Python 3.x 有一些很棒的内置库,但 2.7 只有笨重和过时的库asyncore https://docs.python.org/2/library/asyncore.html/asynchat https://docs.python.org/2/library/asynchat.html和低级select https://docs.python.org/2/library/select.html.

正如安泽尔所说,Python SocketServer:发送到多个客户端 https://stackoverflow.com/questions/3670127/python-socketserver-sending-to-multiple-clients有一个答案使用asyncore,值得一读。但我实际上不会使用它。如果你想用 Python 2.x 编写一个基于 Reactor 的服务器,我要么使用更好的第三方框架,比如Twisted https://twistedmatrix.com/trac/,或者找到或写一个非常简单的直接位于select.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要服务器向所有客户端发送消息(Python、套接字) 的相关文章

随机推荐

  • NHibernate 命名查询参数编号 @p1 @p2 等

    一位同事最近遇到了一个问题 他将单个日期参数传递给命名查询 在查询中 该参数被使用了两次 一次在表达式中 一次在 GROUP BY 子句中 令我们惊讶的是 我们发现NHibernate 使用了两个变量并两次发送单个命名参数 即 p1 和 p
  • 如何使用 String.split(",") 导入 CSV 文件,而不会因空白字段而缩短数组?

    目前 当我逐行导入 CSV 文件时String split 如果有一条线看起来像 foo bar fizz 该方法返回一个长度为 5 的数组 如下所示 foo bar fizz 如何获得返回长度为 8 的数组的方法 foo bar fizz
  • 如何在 Bash 中将文件拆分为每个块 1000 行的块? [复制]

    这个问题在这里已经有答案了 我有一个 6200 行长的文件 如下所示 chrom chromStart chromEnd score a a 1 1 chr1 834359 867552 4 0 020979021 0 0000000000
  • Django 检索 S3 存储桶中的文件列表

    我目前正在研究 django 与 S3 交互的方式 我发现 boto 库很有帮助 但有兴趣创建一个函数来返回特定存储桶内的文件列表的名称 因此我可以循环遍历并仅下载通过特定目录的文件的一部分 import boto from boto s3
  • Python 中的字符串连接与字符串替换

    在 Python 中 我不知道何时何地使用字符串连接与字符串替换 由于字符串连接在性能上有了很大的提升 这 变得更加 是一种风格决定而不是实际决定吗 举一个具体的例子 应该如何处理灵活 URI 的构造 DOMAIN http stackov
  • 如何在powershell的提升模式下执行命令集

    我尝试了以下方法在管理员模式下执行命令 PS gt start process powershell verb runas app Get AppxPackage all Where Object Name like ReleaseName
  • OpenRasta 入门 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您好 有人可以建议开始使用 OpenRasta 的方法吗 也许是文章 教程 示例应用程序和文档 有一些博客文章 OpenRasta简介 h
  • $.post 和 $.ajax 之间的区别?

    很好奇是否有人知道数据参数有什么区别 我有一个 post方法需要一个 myform serialize 作为我的数据参数并且有效 如果我尝试使用相同的 ajax 方法 它不起作用 因为我的数据参数看起来不正确 有谁知道其中的区别以及我可以用
  • 如果这些容器属于不同的层,那么每个应用程序拥有许多 Castle Windsor 容器是否正确?

    我最近一直在玩温莎城堡 并意识到我可以用它来支持我目前已经使用的类似容器的对象 到目前为止 我只阅读了有关每个应用程序只有一个容器实例的应用程序的信息 如果这些容器属于不同的层 那么每个应用程序有许多容器是否正确 我问这个问题的原因是因为我
  • 如何根据R中行之间的日期差异过滤行?

    每个内id 我想保留至少相隔 91 天的行 在我的数据框中df below id 1有 5 行并且id 2有 1 行 For id 1 我想只保留第一 第三和第五行 这是因为如果我们比较第一个日期和第二个日期 它们相差 32 天 因此 删除
  • 将属性添加到类型而不是类型实例的隐式转换

    我正在阅读一些较旧的 Scala 帖子 以更好地理解类型类 然后我运行了 穿过this one https stackoverflow com questions 8524878 implicit conversion vs type cl
  • 在 HTML 中调用 Google Apps 脚本函数

    我担任一支运动队的教练并为其建立了一个网站 我想在管理页面添加一个按钮 单击该按钮即可快速向团队中的每个人发送电子邮件 这封电子邮件的内容如下 今天的日程安排已更改 请访问网站了解更多信息 我确信通过 Outlook 中的通讯组列表或其他东
  • Android:PhoneLookup 的目录数据提供程序

    我正在编写一个自定义 Android 联系人目录 我已经实现了 ContactsContract Directory 提供程序 并且从手机应用程序中进行搜索工作正常 我现在面临的问题是 当我有来电 去电时 Android 拨号器不会查询我注
  • 使用 pywinauto 检查复选框不起作用

    我从 pip 安装了最后一个 pywinauto 模块 我不知道如何使用 Check UnCheck GetCheckState 方法 这是我非常简单的代码示例 from pywinauto import application Start
  • 测试 numpy 数组中的每个元素是否位于两个值之间的简单方法?

    我想知道是否有一种语法上简单的方法来检查 numpy 数组中的每个元素是否位于两个数字之间 换句话说 就像numpy array 1 2 3 4 5 lt 5将返回array True True True True False 我想知道是否
  • antlr 文字字符串匹配:我做错了什么?

    我已经使用antlr 3天了 我可以解析表达式 编写侦听器 解释解析树 这是梦想成真 但后来我尝试匹配文字字符串 foo 但失败了 我可以找到很多声称可以做到这一点的例子 我都试过了 所以我创建了一个小项目来匹配文字字符串 我一定是在做一些
  • C#:如何将DLL嵌入到资源文件中(程序目录中没有DLL副本)

    我有一个需要 X dll 的 C 应用程序 项目 A 我已经将生成X dll的项目添加到A中作为Visual Studio中的参考 我还将 X dll 的发布版本作为二进制文件添加到 A 中的资源文件中 我已经告诉A项目了not将 X dl
  • 在 R 中合并列

    我想使用 R 将数据框的两列合并为一长列 下面有一个可重现的数据 data lt data frame x c 4 5 6 7 7 7 y c 3 4 5 6 7 7 data x y 1 4 3 2 5 4 3 6 5 4 7 6 5 7
  • Waypoint npm - 错误:无法解析“waypoint”

    我有一个 vue 项目并安装了 waypoints npm install waypoints 我尝试导入它 import waypoint from waypoints 但出现错误 错误 无法解析 Mypath 中的 路径点 我究竟做错了
  • 我需要服务器向所有客户端发送消息(Python、套接字)

    这是我的服务器程序 它如何将从每个客户端接收到的数据发送到每个其他客户端 import socket import os from threading import Thread import thread def listener cli