如何测试Tornado(Python)服务器中的最大打开Websocket限制

3 投票
1 回答
2017 浏览
提问于 2025-04-18 17:16

我正在尝试获取与WebSocket服务器的最大连接数。我用Python写了个简单的代码,可以打开28000个连接,但我觉得服务器或客户端的代码可能有问题。

服务器代码(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()

客户端代码

#!/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()

撰写回答