Saturday, August 9, 2014

socket.io with both client and server on nodejs

今更なのん!?なネタを一つメモ書き。今後半自動でバイナリデータの受信を実現する上で大事なのです。

socket.io

socket.io、Websocketを初めとしたhttpを用いたリアルタイム通信を実現するとても高機能なモジュール。

こいつは通常server(nodejs)側にrequire(socketio)を使い、client側(ブラウザ)にrequire(socket.io-client)を使ってアプリケーションを実装することが多いと思う。

ただしクライアントが常にWebブラウザを実装しているとは限らない…というかRaspberryをコンソールで使っている状況では難しそう。ヘッドレスブラウザ使ったり、組み込まれてるブラウザ(Midori?)を頑張って解析すればもしかしたら?かもだけど、目的を逸脱した感じが半端無い…。

解決策は簡単でRaspberry側がnodejs上でrequire('socket.io-client')すればブラウザ無しにserverと通信できる(参考)。流石ですnodejsさん!(とnpmとsocket.io兄貴)。

サンプルコード

手元で動作確認した時のサンプルコードを掲載.

server.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

app.get('/', function(req, res){
    res.sendfile(__dirname + '/index.html');
});

io.on('connection', function(client) {
    console.log('some client has been connected.');
    client.on('message', function(msg) {
        console.log('receive message.');
        client.emit('voice', 'You say ' + msg);
    });
});

client.js

var client = require('socket.io-client');
var socket = client.connect('http://localhost:3000');
socket.on('connect', function() {
    console.log('connection has been established.');

    socket.emit('message', 'まきまき、応答してください。');

    socket.on('voice', function(msg) {
        console.log('Received:' + msg);
        socket.disconnect();
        process.exit(0);
    });
});

index.html(今回htmlはオマケ.)

<html>
    <head>
        <title>socket.io sample.</title>
    </head>
    <body>
        <p>Both server and client will be running on nodejs.</p>
    </body>
</html>

server. clientそれぞれをnodeで起動すると次のような結果が得られる。

$ node server.js
Server running at http://127.0.0.1:3000/
some client has been connected.
receive message.
$ node client.js
connection has been established.
Received:You say まきまき、応答してください。

nodejs楽しいな。いいなこれ。

Written with StackEdit.

No comments:

Post a Comment