LoginSignup
0
1

More than 1 year has passed since last update.

Socket.IOを使って、Node.js(client)とPython(Server)の双方向通信

Last updated at Posted at 2022-11-29

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
⇒無茶苦茶役に立ちました。。ほんとありがとうございます。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1