socket.ioでブラウザ双方向通信をするで、node.jsサーバを介してブラウザ間でテキストを送れることが確認できたので、今度は画像を送ってみる。画像は直接は送れないようなので、base64形式で送る。ブラウザでファイルを読み込んで、base64形式でnode.jsサーバに送り、サーバはその画像データをもう一方のブラウザへ送るという流れ。
①socket.ioライブラリの読み込み
③javascript部の記述
socket.onでブラウザからの画像を受け取り、socket.broadcast.emitでもう一方のブラウザに画像を送る。
ブラウザに以下のような画面が表示される。
「参照...」ボタンを押して画像ファイルを選択すると、もう一方のブラウザ画面に画像が表示される。
1.クライアントサイドのコーディング
①socket.ioライブラリの読み込み
②HTML部の記述(bodyタグ内)
画像ファイルを読み込むためのボタンを設置。socket.io test
③javascript部の記述
// ソケットへ接続(node.jsサーバとブラウザを起動するPCが別の場合は、node.jsサーバのアドレスを指定)
var socket = io( 'http://localhost:9001/' );
socket.on( 'connect', function () {
// サーバから送られた画像を受け取って表示
socket.on( 'image', function( imageData ) {
if ( imageData ) {
var canvas = document.createElement( 'canvas' );
var ctx = canvas.getContext( '2d' );
var img = new Image();
img.src = imageData;
img.onload = function() {
// キャンバスに画像を描画
// ロードし終わってからでないとキャンバスに描画されない
canvas.width = img.width;
canvas.height = img.height
ctx.drawImage( img, 0, 0, 640, 480 );
// bodyにcanvasを追加
document.body.appendChild( canvas );
}
}
});
});
// 相手ブラウザに画像を送る
function sendImage( event ) {
// 選択したファイルのうち1つ目を取得
var file = event.target.files[0];
var reader = new FileReader();
reader.onload = function( event ) {
// Data URLで読み込むとデータはbase64形式になっているので、そのまま送信する
socket.emit( 'image', event.target.result );
};
// Data URLで画像を読み込む
reader.readAsDataURL( file );
}
//ファイルを読み込むボタンのリスナー登録
var file = document.getElementById( 'file' );
file.addEventListener( 'change', sendImage, false );
ボタンを押して画像ファイルを選択すると、sendImageで選択したファイル(ひとつ目)をbase64形式で読み込んでsocket.emitでサーバに送る。また、socket.onでサーバから送られてきた画像を受け取り表示する。
2.サーバサイドのコーディング
1で作成したHTMLをindex.htmとして保存し、それをサーバに置いて読み込む。ポートは9001を使う。// モジュール読み込み
var http = require( 'http' );
var socketio = require( 'socket.io' ); // socket.ioモジュールの読み込み
var fs = require( 'fs' );
// HTTPサーバ(ポート9001)の生成
var port = 9001;
var server = http.createServer( function( req, res ) {
res.writeHead( 200, { 'Content-Type' : 'text/html' } );
// 表示するhtmlの読み込み
res.end( fs.readFileSync( __dirname + '/index.html', 'utf-8' ) );
}).listen( port );
// HTTPサーバへのソケットのひも付け
var io = socketio.listen( server );
io.sockets.on( 'connection', function (socket) {
// ブラウザから画像を受け取る
socket.on( 'image', function ( imageData ) {
// ブラウザから受け取った画像をもう一方のブラウザへ送る
socket.broadcast.emit( 'image', imageData );
});
});
socket.onでブラウザからの画像を受け取り、socket.broadcast.emitでもう一方のブラウザに画像を送る。
3.ファイルをnode.jsサーバに配置
サーバサイド、クライアントサイド両方のファイルをnode.jsサーバに配置する。ここではサーバサイドのファイルをtest.js、クライアントサイドのファイルをindex.htmlとする。4.ブラウザからのアクセス
node.jsサーバを以下のコマンドで起動し、ブラウザの画面を2つ開き、http://localhost:9001/にアクセスする。ブラウザを起動するPCがnode.jsサーバと別の場合は、localhostをnode.jsサーバのIPアドレスに変える。ブラウザに以下のような画面が表示される。

「参照...」ボタンを押して画像ファイルを選択すると、もう一方のブラウザ画面に画像が表示される。

0 件のコメント:
コメントを投稿