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

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

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

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

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

Q&A

3回答

5783閲覧

node.js + WebSocketでのブロードキャストについて

nata-de-Gollira

総合スコア42

Node.js

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

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

0グッド

0クリップ

投稿2016/11/11 04:29

編集2016/11/11 05:20

node.js + WebSocketを使用しています。

クライアント側からメッセージを送るとサーバ側で受信できることは確認したのですが、
サーバから接続されている全クライアントに送信するにはどのように変更すればよいのでしょうか?

色々調べた中で見たサンプルはサーバ側でhoge.clients.forEachみたいな感じでループでsendを実行していますが、上手く行きません(clientsがどこにあるのか?)どのようにして、接続されている全てのクライアント情報を取得できるのでしょうか?

また気になっているのは、多くのサンプルではサーバ側で"connection"onで監視していますが、自分のサーバ側ではconnectionは監視できなく、requestになっています(拾ったサンプルのまま)

よろしくご教示ください。

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ var WebSocketServer = require('/home/hoge/app/nodejs/node_modules/websocket').server; var http = require('http'); var server = http.createServer(function(request, response) { console.log((new Date()) + ' Received request for ' + request.url); var content = "test"; response.writeHead(200, {'Content-Type': 'text/html', 'Content-Length': content.length} ); response.end(); }); server.listen(9001, function() { console.log((new Date()) + ' Server is listening on port 9001'); }); wsServer = new WebSocketServer({ httpServer: server, // You should not use autoAcceptConnections for production // applications, as it defeats all standard cross-origin protection // facilities built into the protocol and the browser. You should // *always* verify the connection's origin and decide whether or not // to accept it. autoAcceptConnections: false }); function originIsAllowed(origin) { // put logic here to detect whether the specified origin is allowed. return true; } wsServer.on('request', function(request) { if (!originIsAllowed(request.origin)) { // Make sure we only accept requests from an allowed origin request.reject(); console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); return; } var connection = request.accept('echo-protocol', request.origin); console.log((new Date()) + ' Connection accepted.'); connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF(message.utf8Data); } else if (message.type === 'binary') { console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); connection.sendBytes(message.binaryData); } }); connection.on('close', function(reasonCode, description) { console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); }); });
this.websocket = new WebSocket(hogehogeURL, ['echo-protocol','soap', 'xmpp']);

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

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

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

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

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

guest

回答3

0

"WebSocket チャットアプリ" などで検索すれば、いくらでもサンプルが出てきます。
以下のようなものが参考になるかと思いますが、いかがでしょうか?


Socket.IOで始めるWebSocket超入門(2):チャットアプリ開発に見る、Socket.IOの基本ライブラリの使い方 (2/3)

[Node.js] Socket.ioで双方向通信チャットアプリを構築 〜 JSおくのほそ道 #005

投稿2016/11/11 08:35

編集2016/11/11 08:37
qt6hy

総合スコア149

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

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

0

どのようにして、接続されている全てのクライアント情報を取得できるのでしょうか?

ざっと見たところ、利用されているライブラリでは、全コネクションを保持するような仕組みは無いようですので、自前で作成されてはどうでしょうか? clients という配列の変数を追加し、 accept したところで、pushし、 close 時に自分自身を削除することで実装できると思います。

また気になっているのは、多くのサンプルではサーバ側で"connection"onで監視していますが、自分のサーバ側ではconnectionは監視できなく、requestになっています(拾ったサンプルのまま)

ライブラリの概念モデルの差だと思います。お使いのライブラリは「接続要求」を受け取って、その要求内容を吟味した後、要求を accept することではじめて接続が確立するというモデルになっていると思われます。ですので、接続要求のイベント名が 'request' になっているのだと思います。これに対して、接続時のネゴシエーションには介入できなくて、接続が完了した状態から始まるようなライブラリもあり、その場合は 'connection' というようなイベントになるのではないでしょうか。

投稿2016/11/11 06:14

mit0223

総合スコア3401

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

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

0

serverからsend関数は使えそうですけど違うパッケージですかね?

wsServer.send('hogehoge'); ←これでいける?

https://github.com/theturtle32/WebSocket-Node/blob/master/docs/WebSocketConnection.md

投稿2016/11/11 05:04

mosapride

総合スコア1480

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

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

nata-de-Gollira

2016/11/11 05:21

回答ありがとうございます。 sendが使用可能かどうかではなくて、接続されているクライアント情報を取得しブロードキャストする方法が知りたいのです。
mosapride

2016/11/11 08:53

wsServer.sendで接続している全員にブロードキャストできませんでした?
nata-de-Gollira

2016/11/15 05:35

それができなかったんです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問