質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

Q&A

解決済

1回答

4861閲覧

node.js+socket.ioの技術を用いて、お絵かきチャットを作りたいが、懸念事項があります

sanset

総合スコア186

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

1グッド

2クリップ

投稿2015/07/16 14:17

お絵かきチャットの実装を考えています。
使用ソフトとソースは下記のサイト様のものをそのまま流用しています。

使用ソースとデモ動画

さくらのVPS環境で構築を行い、上記のシステムが動作するところまで進めました。
ただ、今のままのシステムですと、Aさんが絵を描いている途中でBさんが入室しても、途中まで描かれているAさんの絵は描画されず、真っ白のまま になってしまいます。
Bさんが入室した時に、Aさんが描いていた絵を表示させるようにしたいです。

なので、描くと同時に絵の情報を保存していく機能が必要になると思うのですが、知識不足でどのようにしたらいいか検討もつきません。
この手(node.js+socket.io+canvasでお絵かきチャット)の参考サイトはいくつか見てきましたが、どれもBさんが入室した時には真っ白になるものでした。

何かそういったことが実現できる技術、参考サイトなどがあれば詳しく教えていただきたいです。
どなたか救いの手を・・・よろしくお願いします。

mistletoe👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

描画情報はサーバーサイドへ都度、JSON形式で送信されているようなので、それをメモリ上に保存しておいて、他の人が入室したタイミングでその情報を送信してやればいいと思います。

試せてはないですが、サーバーサイドのサンプルとして。

javascript

1// 描画情報 2var draws = []; 3 4io.sockets.on('connection', function (socket) { 5 6 // 接続時、描画情報があれば送信 7 if (draws.length > 0) { 8 socket.emit('first send', draws); 9 } 10 11 // クライアントからメッセージ受信 12 socket.on('clear send', function () { 13 14 // 自分以外の全員に送る 15 socket.broadcast.emit('clear user'); 16 17 // 描画情報クリア 18 draws = []; 19 }); 20 21 // クライアントからメッセージ受信 22 socket.on('server send', function (msg) { 23 24 // 自分以外の全員に送る 25 socket.broadcast.emit('send user', msg); 26 27 // 描画情報追加 28 draws.push(msg); 29 }); 30 31 // 切断 32 socket.on('disconnect', function () { 33 io.sockets.emit('user disconnected'); 34 }); 35});

後はクライアントにfirst sendの受信処理を入れて、描画情報分、描画処理をやってやれば実装できると思います。

投稿2015/07/16 14:53

chiku_

総合スコア1464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanset

2015/07/16 16:25

上記のコードに訂正して、クライアントに socket.on('first send', function (msg) { //console.log(msg); for(key in msg){ context.strokeStyle = msg[key].color; context.lineWidth = 2; context.beginPath(); context.moveTo(msg[key].fx, msg[key].fy); context.lineTo(msg[key].tx, msg[key].ty); context.stroke(); context.closePath(); } }); という記述を載せたところ成功しました!素早く丁寧な回答に感謝致します。 ベストアンサーにさせていただいた上で、もしよろしければお聞きしたいのですが、 このやり方を導入することで懸念されるような問題点などございますか? 個人的には、drawsの配列が常に増えていくので、配列の最大件数などを設けて描画情報の上限は決めたほうがいいのかなって思っているのですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問