y's note

タイトルの通り備忘録なブログ

Socket.IOについてのメモ

公式のドキュメントが個人的に分かりにくいので自分がよく使っているものを備忘録を兼ねてまとめてみました。


バージョンは執筆時点の最新版であるVer1.3.5です。
それ以外のバージョンでは上手く動かないことがあるので注意してください。


Socket.IOのインストール方法

node.jsのスクリプトファイルがあるディレクトリ(フォルダー)に移動し、

$ npm install socket.io
サーバーへの接続方法

サーバー側

//前略
var port = 80;
var ip = 'localhost';
var io = require('socket.io')(app.listen(port,ip));

//クライアントとの接続に成功するとconnectionイベントが発火する
io.on('connection',function(socket) {
  console.log('connection');
  //クライアントとの接続が切れるとdisconnectedイベントが発火する
  socket.on('disconnected',function() {
   console.log('disconnected');
  }
});



クライアント側
chat.ejs

<!DOCTYPE html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="./js/chat.js"></script>
</head>
<body>
</body>
</html>



chat.js

//http://localhost/にソケット接続を試みる
var socket = io.connect('http://localhost/');

//接続に成功すると'connect'イベントが発火する
socket.on('connect',function() {
 document.write('サーバーと接続しました。');
});



なお、socket.io.jsは自動で生成されるので、作成したり、ファイルを置いたりする必要はありません。
また、サーバー側の処理は'connection'イベントの中に書きます。

データの送信、受信

クライアント側

//データの送信
socket.emit('send','hogehoge');

1番目の引数にイベント名を入れます。
2番目以降の引数にデータを入れます。
なお、型はなんでも構いません。


サーバー側

//データの受信
//クライアント側のイベント名に応じたイベントが発火する
socket.on('send',function(msg) {
 //送信した本人に送り返す
 socket.emit('push',msg);
 //他の人に送信
 socket.broadcast.emit('push',msg);
});

他の人にも送信するのを忘れないように注意してください。


クライアント側

//データの受信
socket.on('push',function(msg) {
 document.write(msg);
});

受信する時の書き方はサーバー側と同じです。

ルーム

ルームの入退室

//'chat'というルームに入室
socket.join('chat');
//ルームから退室
socket.leave('chat');

なお、切断した時にルームから自動的に退室されるのでdisconnectedイベントの中に退室処理を書く必要はありません。


ルーム内でのデータの送受信
クライアント側

socket.emit('send','hogehoge');

クライアント側での送信方法は通常のやり方と全く一緒です。

サーバー側

socket.on('send',function(msg) {
 //自分含む'chat'ルームのメンバー全員に送信
 io.to('chat').emit('push',msg);
});

サーバー側の送信方法もあまり変わりません。
io.toの次にある括弧の中にデータを送信するルーム名、引数は通常の送信方法と同じです。
なお、「socket」ではなく「io」であることに注意してください。


クライアント側

socket.on('push',function(msg) {
 document.write(msg);
});

クライアントの受信方法も全く変わりません。

ソケットIDの取得
var sid = socket.id;

で取得できます。

IPアドレスの取得
var ip = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress;

で取得できます。

例外処理

Ver 1.3.3から例外処理をしないと警告が出るようになりました。

socket.on('error',function(reason) {
 console.error(reason,'Error!');
});

このサンプルの場合、エラーが発生した時、「Error!」と言う文字とともに、エラーの詳細が表示されます。

タイムアウトの時間を短くする

標準のタイムアウトの時間は長すぎて、切断がすぐに検出できないという問題があります。
そのため、タイムアウトの時間を短いぐらいに設定します。


サーバー側

//前略
var io = require('socket.io')(app.listen(ip,port));
//タイムアウトを5秒に設定する
io.set('heartbeat timeout',5000);
io.set('heartbeat interval',5000);

io.on('connection',function(socket) {
 //略
});

このようにタイムアウトの設定を接続した時のイベントの前に書きます。


クライアント側

socket.on('connect',function() {
 //タイムアウトを5秒に設定する
 socket.headbeatTimeout = 5000;
});

サーバーに接続した時に設定するのがおすすめです。

再接続
socket.connect();

とすることで再接続できます。
なお、

//これは間違った書き方です!
io.connect();

は間違いなので注意しましょう。


以上です。
Socket.IOを使うと簡単にソケット通信ができるので楽しいですね。