如何测试Tornado (Python)服务器中的最大WebSocket并发连接限制

3
我正在尝试获取WebSocket服务器的最大打开连接数。我在Python中有一个简单的代码,可以给我28K个打开的连接,但我认为服务器或客户端代码可能有问题。
Server.py
#!/usr/bin/env python

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

class WSHandler(tornado.websocket.WebSocketHandler):
    clients = []

    def open(self):
        self.clients.append(self)
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
        #self.clients.remove(self)
        pass
        #print 'closed connection'

application = tornado.web.Application([
    (r'/ws', WSHandler),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application,no_keep_alive=False)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Client

#!/usr/bin/env python

"""
Connect websockets in concurrency, 
each connection should be open until last connection made and 
server did not response 
"""

import sys
import gevent
from gevent import monkey
from websocket import create_connection



#------------
# Functions 
#------------
def send_hello(n):
    my_count = 0
    while True:
        ws = create_connection(ws_link)
        ws.send("Hello World")
        recv = ws.recv()
        if recv:
           print "-----------------------"
           print "I'm Connection : %r" % n
           print "Sending 'Hello World'"
           print "Received : %s" % recv
           my_count = my_count + 1 
           #ws.close()  # Do not close the connections,
                     # Let's see how much server can handle.. 
           print "I've sent %r messeges to server" % my_count
           print "-----------------------"


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "\nUsage:\n\t %r <ws_link> <number_of_connection>\n" % sys.argv[0]
        sys.exit(1) 
    ws_link, number_of_connections = sys.argv[1:]
    # patches stdlib to cooperate with other greenlets
    #monkey.patch_thread()
    try:
       monkey.patch_all()
       jobs = [ gevent.spawn(send_hello,i) for i in range(int(number_of_connections)) ]
       gevent.wait(jobs)
    except Exception as e:
       print "Error : %r" % e
       sys.exit(1)
1个回答

0
一个问题是你需要一个全局客户端列表。你的服务器代码目前为每个客户端维护了一个仅包含自身的客户端列表。
因此:
#!/usr/bin/env python

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
clients = []

class WSHandler(tornado.websocket.WebSocketHandler):


    def open(self):
        clients.append(self)
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):

        clients.remove(self)
        pass
        #print 'closed connection'

application = tornado.web.Application([
    (r'/ws', WSHandler),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application,no_keep_alive=False)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

这实际上是不正确的。clients 在类评估时被初始化,因此这里根本不是一个因素。 self.clients.append 并没有错。尽管如此,最好将其大写以表示类变量。 - crodjer
1
有问题,检查一下看看你的列表中是否超过2个客户端。self.clients指定为实例变量,因为self指定了该实例。所以不能工作。尝试我建议的解决方案,看看是否可行。 - patapouf_ai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接