Ich schreibe einen Chat-Server und habe beim Testen des Geräts das folgende Problem festgestellt. In einem meiner Komponententests verbinde ich viele Testclients mit meinem Server. Wenn die Anzahl der verbundenen Benutzer 511 erreicht, reagiert der Server nicht mehr ohne Fehlermeldung. Zu diesem Zeitpunkt läuft alles lokal auf einem PC.Twisted: Anzahl der Client-Verbindungen zu TCP-Server begrenzt?
Ich habe einen einfachen Server vorbereitet, Test-Client und Unit-Test-Code zum Einfügen in das Forum.
Irgendeine Idee, warum der Server aufhängt? Jede Hilfe wird sehr geschätzt
Dieser Code ist grundlegend von der verdrehten einfachen Chat-Tutorial. Einfacher Server:
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()
Dies ist mein Test-Client. Dieser Client wird durch den Komponententest mehrmals instanziiert.
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
Schließlich wird die Unit-Test-Code-Datei:
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()
Welches Betriebssystem ist das? könnte es sein, dass du das OS-Limit erreicht hast? –
Danke für die Antwort. Ich arbeite derzeit an Windows 7 64 Bit. Ich bin mir nicht sicher, auf welchem OS der Server läuft, wenn er online geht. Wie kann ich die Begrenzung des Betriebssystems herausfinden (wenn es eines gibt?) – Zoli