Node.jsとPython間で、Socket.ioでメッセージをやり取りする自分用メモ。
いやぁ、、、Python難しい、、、まじでわけわからん。。
やりたかったこと
- Pythonが定期的に(やや重たい)演算処理を実行している
- Python側の演算処理が一巡したら、Node.jsへ結果を送りたい
- また必要に応じてNode.js側からPython側へ演算のもとになるデータを送りたい
- Python側がメインのシステム。
⇒PythonからNode.jsと、Node.jsからPythonへ、双方向でやり取りしたい
⇒とりあえずメッセージをやりとりするための土台をつくろう!
環境
- Windows 10 64bit
- Node.js(v18.0.0)
- Python(3.7.9)
Python のパッケージ
- cmd > pip install python-socketio
⇒依存:python-engineio, bidict - cmd > pip install eventlet
⇒依存:dnspython, greenlet, six
Node.js のパッケージ
- cmd > npm install express
- cmd > npm install socket.io-client
プロジェクトフォルダ構成
folder/
├ node_modules/
├ socketInterface.py
├ app.js
└ package.json
Socket.IO Server(Python)
socketInterface.py
import time,signal,threading
import socketio,eventlet
class SocketInterface(socketio.Namespace):
def on_connect(self, sid, environ):
print('接続しました')
def on_disconnect(self, sid):
print('切断されました')
def on_client_to_server(self, sid, msg):
print(msg + '受信しました')
self.emit('response', msg)
class ThreadServer:
def __init__(self, namespace):
self.sio_ = socketio.Server(async_mode='eventlet')
self.app_ = socketio.WSGIApp(self.sio_)
self.Namespace = SocketInterface(namespace)
self.sio_.register_namespace(self.Namespace)
def start(self):
eventlet.wsgi.server(eventlet.listen(('localhost', 8000)), self.app_)
def run(self):
p = threading.Thread(target=self.start)
p.setDaemon(True)
p.start()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal.SIG_DFL)
thread_server = ThreadServer('/test')
thread_server.run()
while True:
time.sleep(5)
#ctr+Cが入力されたら終了
exit()
Socket.IO Client(Node.js)
app.js
const app = require('express')()
const io = require('socket.io-client')
const socket = io.connect('http://127.0.0.1:8000/test')
app.get('/', (req,res)=>{
res.sendFile(__dirname + "/index.html")
})
app.listen(3000, ()=>{
console.log("listening port=3000...")
})
socket.on('connect', () => {
console.log('socketInterfaceに接続しました');
socket.emit('client_to_server','メッセージだよ')
});
socket.on('response',(msg)=>{
console.log(msg + 'が戻ってきました')
})
メモ
- 使い方は、pythonを実行したあとで、Node.js側を実行する
⇒このスクリプトをベースにいろいろいじってみると何となく挙動が見えてきた
(トライ&エラーで繰り返してたら一応動いた、、というだけ。。) - あとはPythonのWhileループ中で定周期で演算させればOK!
参考
<python-socketio>
https://python-socketio.readthedocs.io/en/latest/
⇒公式。ただ、何を言ってるのかさっぱりわからなかった。。
<ITエンジニアの技術メモ>
https://ittechnicalmemos.blogspot.com/2019/08/pythonsocketio_17.html
⇒無茶苦茶役に立ちました。。ほんとありがとうございます。。