Twisted:与 TCP 服务器的客户端连接数量有限?

2024-04-18

我正在编写一个聊天服务器,并在对其进行单元测试时遇到以下问题。在我的一个单元测试中,我将许多测试客户端连接到我的服务器。当连接的用户数达到 511 时,服务器停止响应,且没有任何错误消息。在此阶段,一切都在 PC 上本地运行。

我准备了一个简单的服务器、测试客户端和单元测试代码粘贴到论坛中。

知道服务器为什么挂起吗? 任何帮助深表感谢

这段代码基本上来自twisted simple chat 教程。 简单服务器:

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

class Chat(LineReceiver):

    def __init__(self, users, userNum):
        self.users = users
        self.userNum = userNum

    def connectionMade(self):
        print "Connected to user %d" % (self.userNum)
        self.users[self.userNum] = self

    def connectionLost(self, reason):
        print "Connection to user %d lost" % (self.userNum)
        if self.users.has_key(self.userNum):
            del self.users[self.userNum]

    def lineReceived(self, line):
        for user in self.users:
            if user == self.userNum:
                continue
            self.users[user].sendLine("%d - %s" % (self.userNum, line))

class ChatFactory(Factory):

    def __init__(self):
        self.users = {} # maps user names to Chat instances
        self.nUsers = 0

    def buildProtocol(self, addr):
        self.nUsers += 1
        return Chat(self.users, self.nUsers)

    def clientConnectionFailed(self, connector, reason): 
        print 'connection failed:', reason.getErrorMessage() 
        reactor.stop() 

    def clientConnectionLost(self, connector, reason): 
        print 'connection lost:', reason.getErrorMessage() 
        reactor.stop() 

reactor.listenTCP(8123, ChatFactory())
reactor.run()

这是我的测试客户端。该客户端由单元测试多次实例化。

import socket

HOST = "localhost"
PORT = 8123

class TestClient:
    def __init__(self):
        self.connected = False
        try:
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except socket.error, msg:
            print("Socket error %s" % msg)

    def connect(self):
        try:
            self.socket.settimeout(10)
            self.socket.connect((HOST, PORT))
            self.connected = True
        except socket.error, msg:
            print("Socket error %s" % msg)
            self.connected = False

    def disconnect(self):
        self.socket.close()

    def connected(self):
        return self.connected

最后是单元测试代码文件:

import unittest
from TestClient import TestClient

class TestSequenceFunctions(unittest.TestCase):

    def test_manyUsers(self):
        users = []

        number_of_users = 1000

        for u in range(number_of_users):
            # create client
            users.append(TestClient())
            # connect client to server
            users[-1].connect()
            # check connected state
            self.assertTrue(users[-1].connected, "User %d is not connected" % (u))

        # close connection of all users
        for user in users:
            user.disconnect()

if __name__ == '__main__':
    unittest.main()

511这个数字相当可疑。它足够接近 2 的幂,因此我最初的预感是任意施加的限制或错误。

既然你提到你在 Windows 上,我想我可以有信心地说这是一个任意施加的限制。 select(2) 支持的套接字数量在所有平台上都受到限制,但在 Windows 上该限制甚至低于通常的限制。默认情况下,它实际上是 64。但是,Python 将此限制提高到 512(该限制不像大多数平台上那样可变,但它在 Windows 上 - 在C编译时间)。

在 511 个用户之后失败听起来就像如果这是系统的限制就会发生的情况 - 第 512 个套接字是侦听连接的套接字。

大多数像这样的限制很难以一般方式找到。通常,您必须深入研究正在使用哪些低级 API 或系统调用,然后查找它们的文档,或者询问并希望其他(不幸的是)记住了所有各种限制的人可以帮助您。 :)

您可以通过在 Windows 上使用基于 IOCP 的反应器来避免此限制。切换起来非常容易。只需插入这些行before服务器中的第一行:

from twisted.internet import iocpreactor
iocpreactor.install()

其他一切都保持不变(特别是,您现有的反应器导入保持不变,并且您继续使用reactor,您不会切换到使用iocpreactor程序中的任何其他位置)。

您可以阅读更多有关反应器选择 http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html在 Twisted 的在线文档中。

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

Twisted:与 TCP 服务器的客户端连接数量有限? 的相关文章

  • Twisted:重新连接ClientFactory连接到不同的服务器

    我有一个扭曲的 ReconnectingClientFactory 我可以通过该工厂成功连接到给定的 ip 和端口 而且效果很好 reactor connectTCP ip 端口 myHandsomeReconnectingClientFa
  • 扭曲的listenSSL虚拟主机

    目前使用一个非常简单的 TwistedNameVirtualHost加上一些 JSON 配置文件 可以在一个文件中提供真正基本的内容Site目的 Twisted 提供的资源都是 Flask 中构建的 WSGI 对象 我想知道如何用一个来包装
  • Twisted Python:无法写入正在运行的生成进程

    我的问题是 在生成进程后 子进程正在循环以从其标准输入获取数据 我想使用 Echo Process pipes 0 write data 或 Echo Process writeToChild 0 data 向其写入新数据 但两者都不起作用
  • 关闭 Twisted 中的非活动连接

    我正在使用 LineReceiver 协议运行 Twisted 服务器 有时客户端会默默地断开连接 因此 Twisted 会保持连接打开 而且由于除非有请求 否则服务器不会发送任何内容 因此永远不会出现 TCP 超时 换句话说 某些连接在服
  • 从 PyInstaller 包访问 Python 解释器

    我有一个生成 Pronsole py 3D 打印 的程序 假设它称为 PROG 如果只是用Python解释 它在GNU Linux和Windows中运行良好 这是有效的行 self pronTranspProc reactor spawnP
  • 如何从控制台运行twisted?

    我在 Windows 7 上使用 Python 3 和 Anaconda 我安装了 Twistedconda install twisted 现在我正在尝试运行twisted or twistd 从控制台 但我收到此错误 twisted 不
  • 线程与异步

    我一直在阅读这篇非常好的文章中的线程编程模型与异步模型 http krondo com blog p 1209 http krondo com blog p 1209 不过 文章提到了以下几点 只要有 I O 异步程序就会通过在任务之间进行
  • 在twisted中将http重定向到https

    我正在使用twisted 运行一个django 应用程序 我现在从 http 迁移到 https 如何在twisted 中添加从http 到https 的重定向 从 HTTP 上的任何给定路径重定向到 HTTPS 上的同一路径 基于让 保罗
  • 扭曲的 HTTPS 客户端

    我目前在使用扭曲的 python 库访问通过 https 托管的内容时遇到一些问题 我是这个库的新手 并且假设我缺少一些导致问题的概念 但可能不是基于示例 这是我收集示例的页面的链接 https twistedmatrix com docu
  • 如何杀死扭曲的协议实例python

    我有一个使用 Twisted 用 python 编写的服务器应用程序 我想知道如何终止我的协议 bottalk 的实例 每次我获得新的客户端连接时 我都会在内存中看到该实例 print Factory clients 但是假设我想从服务器端
  • 扭曲中的持久连接

    我是 Twisted 的新手 有一个问题 如何在 Twisted 中组织持久连接 我有一个队列 每秒都会检查它 如果有一些 发送给客户端 我找不到比每秒调用 dataReceived 更好的方法了 下面是协议实现的代码 class Sync
  • Twisted 中的多重响应

    我正在尝试开发简单的TCP 使用 Twisted 和 Pygame 进行客户端 服务器游戏 但我在向客户端发送数据时遇到困难 Twisted 不允许我连续发送多个响应 这就是我想做的 我有方法处理玩家状态更改并将其重新发送给其他客户端 de
  • 螺纹扭曲...如何正确使用它们?

    我需要编写一个运行两个线程的简单应用程序 线程 1 按定时运行 假设每 1 分钟运行一次 线程 2 只是一个执行 操作 的 正常 while True 循环 如果不是按定时间隔运行的要求 我根本不会考虑扭曲 但简单的 sleep 60 还不
  • 验证 SSL/X.509 证书是否由另一个证书签名

    Question 如何使用 PyOpenSSL 或 Twisted 验证 X 509 证书是否由另一个证书签名 我希望客户端验证收到的服务器证书是否是签署其客户端证书的证书 我浏览了 PyOpenSSL 文档 似乎找不到任何关于如何与建立
  • 在 Node.js 中创建 TCP 服务器和 HTTP 服务器之间的 WebSocket

    我创建了一个TCP服务器 using Node js它监听客户端连接 我需要传输数据TCP服务器 to HTTP服务器再次在 Node js 中可能通过网络套接字 套接字 io 但是 我不知道如何创建这样的连接 以便 TCP 服务器能够通过
  • Python 网络服务

    我正在做类似于 Ubuntu Landscape 的服务器 客户端应用程序 http www canonical com enterprise services ubuntu advantage landscape http www can
  • 子类化 static.File

    我是 Twisted 的新手 在对twisted 中的 static File 进行一些必要的子类化时遇到了麻烦 我正在尝试在子类中设置请求标头 class ResponseFile static File def render GET s
  • Python扭曲:如何调度?

    在 Twisted 中有 1 天的经验 我尝试安排消息发送以回复 tcp 客户端 import os sys time from twisted internet import protocol reactor self scenario
  • Twisted:与 TCP 服务器的客户端连接数量有限?

    我正在编写一个聊天服务器 并在对其进行单元测试时遇到以下问题 在我的一个单元测试中 我将许多测试客户端连接到我的服务器 当连接的用户数达到 511 时 服务器停止响应 且没有任何错误消息 在此阶段 一切都在 PC 上本地运行 我准备了一个简
  • 扭曲多种协议

    我希望为我正在从事的项目学习扭曲 该项目需要服务器响应 HTTP 请求以及通过 TCP 连接的其他协议 Twisted能够同时处理多种协议吗 我想使用 Twisted Web 来帮助处理 HTTP 但同时需要响应其他端口上的 TCP 连接

随机推荐

  • JSHint 和 eclipse 插件

    所以我刚刚在 Eclipse Kepler 中安装了 JSHint 我加载了 jshintrc 文件 如何在我的 javascript 文件上运行 jshint 我没有看到菜单项 也没有看到指定文件名等的地方 有人可以帮忙吗 添加后 jsh
  • 任意预设精度小数(几乎像 BigDecimal)

    我正在寻找一个 java 类 它将保存具有任意预设精度的十进制值 班上BigDecimal看起来是一个很好的起点 但我希望能够将小数的大小限制为最终用户决定的大小 从字面上讲 最终用户将指定一个以 10 为基数的范围 我将分配足够的字节来表
  • 如何使用 open() 函数清除 .txt 文件?

    我有一个简单的程序 可以打开文件并替换文本 但是 我希望程序清除文件 然后保存需要保存的内容 我怎么做 或者有更简单的方法吗 如果您使用模式打开文件w如果文件已经存在 它将覆盖该文件 with open your file w as f f
  • 加载内核模块时出现未知符号

    我需要帮助理解为什么在插入模块时出现错误 我努力了this http www linuxforums org forum kernel 56497 unkown symbol module error while insmodding bu
  • spring jar bootRun 导致 GraphQL Schema 错误

    当我使用 gradle 构建 Spring Boot 应用程序时bootRun or build然后运行输出 jar 我从控制台日志中得到以下大量错误列表 2018 03 18 00 49 38 754 ERROR 228 main o s
  • Qt 自定义外观和感觉?

    我可以强制我的 Qt 应用程序使用不同的外观和感觉 就像在 KDE 中一样吗 您始终可以使用 QApplication setStyle 更改小部件的样式 Qt4 中有一些预定义的选项可用 在 main cpp 中做这样的事情 includ
  • 如何使用 ggplot2 面颜色和形状?

    也许 我错过了 ggplot 语法中的一些内容 可以毫无错误地绘制以下 3 个方面 不幸的是 面图混合了颜色和形状 右侧一栏应仅显示蓝色标记 而中间一栏应显示绿色标记 data1 num delay claim supply project
  • 错误:输入文件并非全部位于同一目录中,请提供显式 wd

    在尝试构建一个大约两周前工作的 PDF 后 没有大惊小怪 在一台全新安装了 R R studio 的新机器上 bookdown等等 我有这个错误 Error Input files not all in same directory ple
  • Laravel 迁移更改列的默认值

    我有一个已分配默认值的表 例如 我们可以看看以下内容 Schema create users function Blueprint table table gt increments id gt unsigned table gt inte
  • 子元素悬停时的 CSS 过渡

    当子元素的父元素悬停在其上方时 我试图暂停子元素的显示 Html span div This Is The Child div Some Text in the span span Css span position relative sp
  • 如何在 php 脚本仍在运行时显示结果

    所以我尝试过在脚本仍在执行时显示结果 https stackoverflow com questions 5415665 show results while script is still executing 但由于某种原因它不起作用 所
  • Jshell错误:java.lang.NullPointerException:charsetName

    我正在尝试使用 JDK11 提供的 JShell 来运行一些简单的命令 但是当我输入 jshell gt System out println Hello World 它给了我错误 Exception in thread main java
  • 抽象类中可以有静态数据成员吗?

    我设计了一系列相关的类 为了能够管理它们 我让它们从一个抽象类派生 这些类都需要访问一系列共享资源 我发现自己在每个类中创建了一个指针向量 它们全部相同 它们必然必须相同 似乎在基类中创建一个静态成员将使所有派生类都可以访问该向量 这意味着
  • 如何向我的应用程序添加“撰写评论”/“给我们评分”功能?

    我希望在我的应用程序中添加某种 撰写评论 或 给我们评分 功能 以便我的客户可以轻松地对我的应用程序进行评分和评论 我能想到的最佳实践是在我的应用程序中进行某种弹出窗口或打开 UIWebView 这样用户在打开 App Store 应用程序
  • Whatsapp 预览链接上未显示缩略图和说明

    我知道也有类似的问题here https stackoverflow com questions 19778620 provide an image for whatsapp link sharing and here https stac
  • TFS分行拒绝前往

    我们使用的是 TFS 2010 使用的客户端是 VS 2008 VS 2010 和 VS 2012 我使用 VS 2010 功能来查看 TFS 层次结构功能 以可视化我的 TFS 分支设置并对其进行维护 问题是 一旦分支上的工作完成 我右键
  • 将现有属性添加到所有属性集

    我有一个existing嵌入代码的属性 我需要将此属性与 120 多个现有属性集相关联 如果我知道属性集 ID 如何以编程方式将该属性添加到所有属性集 我发现为这个问题编写代码很有趣 所以这里是有效的解决方案 在 php 脚本 包括 mag
  • UML 设计类图:具有另一个类作为属性的类?

    我很难弄清楚如何将特定场景建模为 UML 设计类图 假设我有以下情况 我有一个名为 CPoint 的类 它有两个属性 x 和 y R2 平面中的坐标 另外 我有一个名为 CLine 的类 它应该有两个 CPoint 作为属性 这对代码来说非
  • 我的 apt 安装 boost 时搞砸了

    在Ubuntu上 gt sudo apt get install libboost all dev Reading package lists Done Building dependency tree Reading state info
  • Twisted:与 TCP 服务器的客户端连接数量有限?

    我正在编写一个聊天服务器 并在对其进行单元测试时遇到以下问题 在我的一个单元测试中 我将许多测试客户端连接到我的服务器 当连接的用户数达到 511 时 服务器停止响应 且没有任何错误消息 在此阶段 一切都在 PC 上本地运行 我准备了一个简