【JavaScript】SocketIOで通信しよう
こんばんは葛の葉です。
今回はSocketIOでJavaScriptとPythonを通信してみます。
JavaScript側(サーバー側)
前回のWebAPIの記事の際はJavaScriptがクライアント側でしたが、今回はサーバー側に回ります。
SocketIOで通信をする場合、Httpでの通信を確立しないと行けないようです。デフォルトのHttpサーバーとなるhttp
モジュールとルーティング機能を持つexpress
モジュールと主役のsocket.io
モジュールが必要になります。
npm install --save express npm install --save socketio
ソースコードは以下のようになります。
# soc.ts import * as http from "http"; import * as express from "express"; import * as socketIo from "socket.io"; const app = express(); const server = http.createServer(app); const sio = socketIo(server); app.get('/', function(req, res){ res.send('Hello World!') }); sio.on('connection', (socket)=>{ socket.on('kuzunoha', function(message) { console.log(`GetMessage:message=${message}`); }); }); server.listen('3000', function(){ console.log('hoge') })
tsc soc.ts
として、コンパイルします。その後、node soc.js
を実施します。
$ node soc.js hoge (ここでターミナルは止まっている)
上記の設定を行ったのでhttp://127.0.0.1/
にSocketIOでアクセスするとWebSocketを使った通信ができるようになります。Httpでの通信はあくまで疎通のためのものであり、実際にデータのやりとりをする際にはサーバー側とクライアント側にそれぞれ同じイベント名をもたせる必要があります。今回はkuzunoha
というイベントをサーバー側に用意しました。kuzunoha
イベントを受け取るとmessage
というデータを受け取り、そのメッセージをサーバー側のconsole.log()
で表示するというものになっています。
Python側(クライアント側)
今回のPythonはクライアント側になります。
使用するモジュールはpython-socketio
です。
いくつかPython向けのSocketIO用モジュールはあったのですが、比較的最近更新されているもので、メジャーバージョンが1以上なのはこれくらいしかありませんでした。(調査量は大したもんじゃないですけど)
pip install python-socketio
# soc.py import socketio sio = socketio.Client() def on_connect(): sio.emit('kuzunoha', 'Korega Kusanagino Kenda') sio.on('connect', on_connect) sio.connect('http://127.0.0.1:3000/') sio.wait()
sio.emit
にてkuzunoha
というイベント名でon_connect
という関数を記載しています。python soc.py
実行するとJavaScript側でのコンソールに以下のような変化が行われます。
$ node soc.js hoge GetMessage:message=Korega Kusanagino Kenda
これでPythonの情報がNode.jsに送ることができました。