Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【JavaScript】SocketIOで通信しよう

こんばんは葛の葉です。

今回はSocketIOでJavaScriptPythonを通信してみます。

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
(ここでターミナルは止まっている)

f:id:Kuzunoha-NE:20190905205427p:plain
Hello Worldと表示される

上記の設定を行ったのでhttp://127.0.0.1/にSocketIOでアクセスするとWebSocketを使った通信ができるようになります。Httpでの通信はあくまで疎通のためのものであり、実際にデータのやりとりをする際にはサーバー側とクライアント側にそれぞれ同じイベント名をもたせる必要があります。今回はkuzunohaというイベントをサーバー側に用意しました。kuzunohaイベントを受け取るとmessageというデータを受け取り、そのメッセージをサーバー側のconsole.log()で表示するというものになっています。

Python側(クライアント側)

今回のPythonはクライアント側になります。

使用するモジュールはpython-socketioです。

pypi.org

いくつか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に送ることができました。