簡體   English   中英

如何在實時服務器而不是本地主機上使用 Tornado 實現 WebSocket

[英]how can I implement a WebSocket using Tornado on a live server instead of localhost

我是使用 WebSockets 的新手,到目前為止僅限於通過 localhost 使用它們並在本地開發所有內容。 我已經按照本教程進行實時數據可視化: https : //medium.com/@benjaminmbrown/real-time-data-visualization-with-d3-crossfilter-and-websockets-in-python-tutorial-dba5255e7f0e

我完成了教程(所有腳本都可以從文章中的 GitHub 鏈接獲得),並且它通過 localhost 完美運行。 但是,我有一些網站空間,我可以在其中放置主索引腳本,當 WebSocket 腳本在瀏覽器中顯示網站的同一台本地機器上運行時(在本例中為偵聽 localhost 8001),但我正在努力弄清楚如何將 WebSocket 與實時服務器一起使用,而不僅僅是通過本文中的本地主機方法! 我希望能夠通過我的網站訪問顯示來自任何計算機的實時數據的網頁,即有一台運行 WebSocket 的計算機與在其瀏覽器中顯示網站的計算機無關。 任何幫助將不勝感激!

編輯:我認為我特別需要幫助重寫websocket.py腳本,以便將信息饋送到服務器,即www.examplewebsite.com ,然后我可以通過我的索引文件頁面訪問www.examplewebsite.com /index.html在我的索引文件中使用 js:

var connection = new WebSocket('wss://examplewebsite.com/blank:8001/websocket');

或類似的東西,而不是

 var connection = new WebSocket('ws://localhost:8001/websocket');

在原始版本中,但我不確定在使用現有代碼設置 WebSocket 時如何建立它,以便在索引文件中進行偵聽。 在我的本地機器上運行 WebSocket 時,實時網頁成功顯示實時更新數據,但是,如果其他人(未運行 WebSocket)進入同一頁面,他們將看不到實時數據。

websocket.py腳本如下:

import time
import random
import json
import datetime
import os
from tornado import websocket, web, ioloop
from datetime import timedelta
from random import randint

paymentTypes = ["cash", "tab", "visa","mastercard","bitcoin"]
namesArray = ['Ben', 'Jarrod', 'Vijay', 'Aziz']


class WebSocketHandler(websocket.WebSocketHandler):
  # Addition for Tornado as of 2017, need the following method
  # per: http://stackoverflow.com/questions/24851207/tornado-403-get-warning-when-opening-websocket/25071488#25071488
  def check_origin(self, origin):
    return True

  #on open of this socket
  def open(self):
    print ('Connection established.')
    #ioloop to wait for 3 seconds before starting to send data
    ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=3), self.send_data)

 #close connection
  def on_close(self):
    print ('Connection closed.')

  def check_origin(self, origin):
    return True

  # Our function to send new (random) data for charts
  def send_data(self):
    print ("Sending Data")
    #create a bunch of random data for various dimensions we want
    qty = random.randrange(1,4)
    total = random.randrange(30,1000)
    tip = random.randrange(10, 100)
    payType = paymentTypes[random.randrange(0,4)]
    name = namesArray[random.randrange(0,4)]
    spent = random.randrange(1,150);
    year = random.randrange(2012,2016)

    #create a new data point
    point_data = {
        'quantity': qty,
        'total' : total,
        'tip': tip,
        'payType': payType,
        'Name': name,
        'Spent': spent,
        'Year' : year,
        'x': time.time()
    }

    print (point_data)

    #write the json object to the socket
    self.write_message(json.dumps(point_data))

    #create new ioloop instance to intermittently publish data
    ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=1), self.send_data)

if __name__ == "__main__":
  #create new web app w/ websocket endpoint available at /websocket
  print ("Starting websocket server program. Awaiting client requests to open websocket ...")
  application = web.Application([(r'/static/(.*)', web.StaticFileHandler, {'path': os.path.dirname(__file__)}),
                                 (r'/websocket', WebSocketHandler)])
  application.listen(8001)
  ioloop.IOLoop.instance().start()

GitHub的鏈接,所有的教程腳本,我使用index.htmlwebsocket.pyhttps://github.com/benjaminmbrown/real-time-data-viz-d3-crossfilter-websocket-tutorial/tree/master/ rt-data-viz

注意:在我的版本中,我用外部設備生成的數字替換了websocket.py腳本中一些隨機生成的數字,因此必須在連接到所述外部設備的機器上的 python 中建立 WebSocket。

您的 Web 套接字服務器應該運行在可以通過 DNS 通過主機名IP 地址找到的系統上,並在端口 8001 上偵聽連接。

假設這個系統可以在local.host.home找到(ping,nslookup),然后改變

var connection = new WebSocket('ws://local.host.home:8001/websocket');

現在服務器應該提供任何連接的客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM