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

如何在Tornado(Python)服务器中测试最大开放Websocket限制,python,websocket,tornado,Python,Websocket,Tornado,我正在尝试获取到websockets服务器的最大打开连接数。我用Python编写了一些简单的代码。这给了我28K的开放连接,但我认为服务器或客户端代码可能有问题 Server.py #!/usr/bin/env python import tornado.httpserver import tornado.websocket import tornado.ioloop import tornado.web class WSHandler(tornado.websocket.WebSocket

我正在尝试获取到websockets服务器的最大打开连接数。我用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()
客户端

#!/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)
#/usr/bin/env python
"""
并发连接WebSocket,
每个连接都应打开,直到最后一次连接,并且
服务器没有响应
"""
导入系统
导入gevent
从gevent导入猴子
从websocket导入创建\u连接
#------------
#功能
#------------
def发送\你好(n):
我的计数=0
尽管如此:
ws=创建\u连接(ws\u链接)
发送(“你好世界”)
recv=ws.recv()
如果记录:
打印“---------------------------”
打印“我正在连接:%r”%n
打印“发送‘Hello World’”
打印“已接收:%s”%recv
我的计数=我的计数+1
#ws.close()#不要关闭连接,
#让我们看看服务器能处理多少。。
打印“我已将%r邮件发送到服务器”%my\u count
打印“---------------------------”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
如果len(sys.argv)!=三:
打印“\n用法:\n\t%r\n”%sys.argv[0]
系统出口(1)
ws\u link,连接数=sys.argv[1:]
#补丁stdlib与其他Greenlet合作
#monkey.patch_thread()
尝试:
猴子
jobs=[gevent.spawn(send_hello,i)for范围内的i(int(连接数))]
gevent.wait(作业)
例外情况除外,如e:
打印“错误:%r”%e
系统出口(1)

一个问题是您需要一个全局客户列表。您的服务器代码当前为每个客户机都有一个客户机列表,该列表仅包含其自身

因此:


事实并非如此<代码>客户端在类求值时被初始化,因此这根本不是一个因素
self.clients.append
没有错。尽管如此,最好将其大写以表示类变量。这是错误的,请检查列表中是否有超过2个客户端
self.clients
指定实例变量,因为
self
指定实例。所以我不能工作。试试我建议的解决方案,看看是否有效。
#!/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()