Flast-Sockets + redis-py で簡単 Websocket サーバー実装
参考にしたサイト
使うもの
したかったこと
Python とJavascript とのリアルタイム通信
Python 側
- Flask-Sockets で Websocket サーバーを立てる
- バックグラウンドでの情報の通信は redis-py を使って行う。
Javascript側
- Websocket を使う
実装
server.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2017 zenbook <zenbook@zenbook-XPS> # # Distributed under terms of the MIT license. """ """ from flask import Flask from flask_sockets import Sockets import redis import threading import gevent app = Flask(__name__) sockets = Sockets(app) client = redis.StrictRedis(host='localhost', port=6379, db=0) class MessageServer(object): """Interface for registering and updating WebSocket clients.""" def __init__(self): self.clients = list() self.pubsub = client.pubsub() self.pubsub.subscribe("channel") def __iter_data(self): for message in self.pubsub.listen(): data = message.get('data') if message['type'] == 'message': app.logger.info(u'Sending message: {}'.format(data)) yield data def register(self, client): """Register a WebSocket connection for Redis updates.""" self.clients.append(client) def send(self, client, data): """Send given data to the registered client. Automatically discards invalid connections.""" try: client.send(data) except Exception: self.clients.remove(client) def run(self): """Listens for new messages in Redis, and sends them to clients.""" for data in self.__iter_data(): for client in self.clients: self.send(client, data) def start(self): """Maintains Redis subscription in the background.""" self.run() ms = MessageServer() @sockets.route('/mychannel') def echo_socket(ws): ms.register(ws) while not ws.closed: gevent.sleep(0.1) @app.route('/') def hello(): return 'Hello World!' if __name__ == "__main__": from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler t = threading.Thread(target=ms.start) t.daemon = True t.start() #ms.start() print "WSGI Server starts" server = pywsgi.WSGIServer(('', 5000), app, handler_class=WebSocketHandler) server.serve_forever() |
ticker.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2017 zenbook <zenbook@zenbook-XPS> # # Distributed under terms of the MIT license. """ """ from flask import Flask from flask_sockets import Sockets import redis import random import time if __name__ == '__main__': app = Flask(__name__) sockets = Sockets(app) client = redis.StrictRedis(host='localhost', port=6379, db=0) pubsub = client.pubsub() pubsub.subscribe("channel") price = 0 while True: price += random.uniform(-10, 10) print("Sending Price", price) client.publish("channel", price) time.sleep(1) |
javascript
1 2 3 4 5 6 7 8 9 10 11 |
webSocket = new WebSocket(uri); webSocket.onopen = function (e) { console.log(e.data); }; webSocket.onopen = function () { console.log("OnOpen"); }; webSocket.onerror = function (error) { console.log('WebSocket Error ' + error); }; console.log(webSocket.extensions); |



About Fx-Kirin
2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。
- Web |
- More Posts (410)
Adsense
関連記事
-
-
重回帰分析による米雇用統計の予測モデルを作成してみる
この記事はPython その2 Advent Calendar 2015 の17日目の記事です。 1 はじめに
-
-
Python Pandas からお手軽に highcharts が使える kanichart 作りました。
Kanichart fx-kirin/kanichart: Easy(簡易) plotting library.
-
-
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介
以前こんな記事を書いていたのですが、これがまったく不要になるとても便利なPython Libraryがあった
-
-
PythonでsleepしているThreadを呼び起こすプラクティス
Pythonのsleep中のThreadをWake up PythonのThreadにて、RubyのThr
-
-
Python Mock で オリジナルのインスタンメソッドのを呼びたい時
autospec と sideeffect を組み合わせるのが解決策だった。
-
-
まだ Python の datetime で消耗しているの? maya 使おうぜ
この記事は Python Advent Calendar 2016 の 24日目の記事です。 当初は SCOOP
-
-
ctypes で c_char array を c_char_p に変換する
なかなか情報がなかったのでメモ書き。
-
-
Wine 上の MT4から ZeroMQ を使って Linux の pyzmq の通信をさせる
こんにちは。キリンです。 最近、年に数度のMQLを書くときがきたのですが、Pythonに慣れまくっていると苦行でし
-
-
Python2 から Python3 へのC Extension の移行
最初に追加 モジュールの初期化と状態情報を書き換える initmyextension 関数などの初期状態の関
-
-
SQLAlchemy のマイグレーションライブラリ Alembic を使ってみる。
SQLAlchemyの作者が作ったデータベースマイグレーションツール。個人的には、SQLAlchemyは使わないが、
Adsense
NEW ENTRY
-
- Linux Mint 20 での日本語の設定について。
フォントの設定とかはいろいろなところで触れられているので、他にない情報だけ。 TL;DR F
-
- joblib によって謎のバグが起こる
joblib 0.14.1 にて確認.0.13.2 だと起こらない.import joblib を消
-
- Fixing kernel error AMD-Vi: Event logged IO_PAGE_FAULT on Ryzen Machine
My pc was periodically shut down on 7:40 am JS
-
- Ubuntu で仮想ディスプレイを使う
雑多な備忘録ですが、せっかくなので残しておきます。 Ubuntu 18.04 の resolv.c
-
- PYPIへの登録を10秒でできるようになる方法
pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリ
Twitter
RSS
カテゴリー
-
人気記事一覧
任意のインジケータのシグナルでアラートやメール機能を追加する 402ビュー
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介 184ビュー
まだBokehで消耗してるの?これからはPandas-Bokehを使おうぜ 139ビュー
Synology DS216j の MySQL に外部からつなぐ 110ビュー
Ubuntu で仮想ディスプレイを使う 95ビュー
Linux Mint 20 での日本語の設定について。 95ビュー
Add Alert and SendMailの改造 90ビュー