- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个聊天服务器并在对其进行单元测试时遇到以下问题。在我的一个单元测试中,我将许多测试客户端连接到我的服务器。当连接的用户数达到 511 时,服务器停止响应且没有任何错误消息。在这个阶段,一切都在 PC 上本地运行。
我准备了一个简单的服务器、测试客户端和单元测试代码来粘贴到论坛中。
知道服务器挂起的原因吗?非常感谢任何帮助
这段代码基本上来自扭曲的简单聊天教程。简单服务器:
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 的 react 器来避免此限制。很容易切换到。只需在服务器的第一行之前插入这些行:
from twisted.internet import iocpreactor
iocpreactor.install()
其他一切都保持不变(特别是,您现有的 react 堆导入保持不变,并且您继续使用 reactor
,您不会切换到使用 iocpreactor
程序中的任何其他位置)。
您可以阅读更多关于 reactor selection 的信息在 Twisted 的在线文档中。
关于Twisted:客户端连接到 TCP 服务器的数量有限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10054177/
我有一个关于复杂性的简单问题。我在 Java 中有这段代码: pairs是 HashMap包含 Integer作为键,它的频率为 Collection作为一个值。所以: pairs = new Has
对于我的应用程序,我需要在 Coq 中使用和推理有限映射。谷歌搜索我发现 FMapAVL 似乎非常适合我的需求。问题是文档很少,我还没有弄清楚我应该如何使用它。 作为一个简单的例子,考虑以下使用对列表
我有一个主表tblAssetMaster A和一个移动表tblMovement M。 我想提取所有 Assets 及其当前位置,因此需要获取每个 Assets 的最新移动条目。 字段 A: Asset
我想让我的网站内容居中,但仅限于网页的特定宽度。所以当它超过 500px 时,我希望内容被修复,无法进一步拉伸(stretch)。无论如何都要这样做,还是我最好把所有东西都修好?希望有意义的是添加一些
我正在尝试批量删除 Backbone 模型的集合,如下所示...... collection.each(function(model, i){ model.destroy(); }); 我发现当每
我想要一个软件环境,在其中我可以在具有特定资源的硬件上测试我的软件的速度。例如,当我的主机硬件是具有 12GB RAM 的 3GHz 四核 amd64 时,该程序在具有 24 Mb RAM 的 800
在 Eclipse 中,我得到了 BigInteger.valueOf(2).pow(31093) 的值,但没有得到 BigInteger.valueOf(2).pow(31094) 的值(它是空的)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我想将 2 个表从本地 sql server 2000 上传到托管的 mysql。第一个表有 17 列和 680 行,其他 10 列和 8071 行。 我首先使用 xampp mysql 尝试离线,它
我在 S3 中自动生成并保存了静态 html 文件。有时文件大小达到 2mb。是否可以使用javascript来获取html文件的一部分,显示它,当用户到达页面底部时,获取下一部分等等? 最佳答案 X
我是一名优秀的程序员,十分优秀!