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

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

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

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

WebSocket

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

Q&A

解決済

1回答

4695閲覧

Websockeによるチャットアプリにルーム機能を付けたい

asakura

総合スコア29

Node.js

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

WebSocket

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

0グッド

0クリップ

投稿2017/08/30 14:37

Websocketを使ったチャットアプリを作ってます。
クライアントから任意の文字列をサーバ側に渡し、チャットルームを生成したいのですが、
任意の文字列はサーバ側に送っていてチャットルームが生成されているものの、
サーバから入力したメッセージは、接続しているすべてのクライアントに送信されてしまい、
意図している挙動になりません。

どのように対処すれば解決するか、教えて頂けないでしょうか。
よろしくお願い致します。

実際のチャットアプリのコードを以下に添付します。

js

1// chatサーバ 2var socketio = require('socket.io'); 3var io; 4 5exports.listen = function(server) { 6 io = socketio.listen(server); 7 io.sockets.on('connection', function(clientSocket) { 8 console.log("WebSocket接続"); 9 10 // クライアントから送られて来たルーム値でルームを開設 11 var room = ""; 12 clientSocket.on("from_client", function(data) { 13 room = data.value; 14 console.log("クライアントから送信されたroom: %s", room); 15 joinRoom(clientSocket, room); 16 }); 17 18 // チャットメッセージを書き込むと処理する 19 handleMessageBroadcasting(clientSocket); 20 21 // クライアントから送られてきたメッセージ受け取り 22 clientSocket.on("from_client", function(name, message) { 23 console.log("クライアントから送信されたname: %s", name); 24 console.log("クライアントから送信されたmessage: %s", message); 25 io.sockets.emit('receiveMessage', { name: name, message: message }); 26 }); 27 }); 28}; 29 30function joinRoom(clientSocket, room) { 31 // ユーザーをルームに参加させる 32 clientSocket.join(room); 33 // ユーザに新しいルームに入ったことを知らせる 34 clientSocket.emit('joinResult', { room: room }); 35} 36 37function handleMessageBroadcasting(clientSocket) { 38 clientSocket.on('newChatMessage', function(name, message) { 39 console.log("サーバから送信されたname: %s", name); 40 console.log("サーバから送信されたmessage: %s", message); 41 // チャットに書き込んだメッセージをクライアントに通知 42 io.emit('from_server', { name: name, message: message }) 43 }); 44}

js

1// chatサーバのUI生成 2 3// チャットメッセージの書き込み 4function updateChatMessage(chatApp, name, message) { 5 if (name == "山田 太郎") { 6 var messageElement = $("<il><p class='sender_name me'>" + name + "</p><p class='right_balloon'>" + message + "</p><p class='clear_balloon'></p></il>"); 7 // クライアントに通知 8 chatApp.sendMessage(name, message); 9 } else { 10 var messageElement = $("<il><p class='sender_name'>" + name + "</p><p class='left_balloon'>" + message + "</p><p class='clear_balloon'></p></il>"); 11 } 12 // チャットボードに書き込み 13 $('#messages').append(messageElement); 14 $('#messages').scrollTop($('#messages').prop('scrollHeight')); 15 $('#send-message').val(''); 16} 17var socket = io.connect('http://localhost:3000'); 18 19$(document).ready(function() { 20 var chatApp = new Chat(socket); 21 // ルームに参加 22 socket.on('joinResult', function(result) { 23 console.log("ルームへ入室", result.room) 24 $("#room").text("接続しているルーム: " + result.room); 25 }); 26 27 // クライアントから来たメッセージの受信 28 socket.on('receiveMessage', function(data) { 29 updateChatMessage(chatApp, data.name, data.message); 30 }); 31 32 $("#send-message").focus(); 33 // 「送信」ボタンをクリック 34 $('#send-button').click(function() { 35 // フォームに入力したメッセージを取得 36 var message = $('#send-message').val(); 37 updateChatMessage(chatApp, "山田 太郎", message); 38 }); 39});

js

1// chatクラス生成 2var Chat = function(socket) { 3 this.socket = socket; 4}; 5// クライアントに書き込んだメッセージ内容を返す 6Chat.prototype.sendMessage = function(name, message) { 7 this.socket.emit('newChatMessage', name, message); 8}

js

1// ChatクライアントUI生成 2 3// チャットメッセージの書き込み 4function clientChatMessage(chatApp, name, message) { 5 if (name == "山田 次郎") { 6 var messageElement = $("<il><p class='sender_name me'>" + name + "</p><p class='right_balloon'>" + message + "</p><p class='clear_balloon'></p></il>"); 7 8 // クライアントからメッセージの送信 9 socket.emit('from_client', name, message); 10 11 } else { 12 var messageElement = $("<il><p class='sender_name'>" + name + "</p><p class='left_balloon'>" + message + "</p><p class='clear_balloon'></p></il>"); 13 } 14 // チャットボードに書き込み 15 $('#messages').append(messageElement); 16 $('#messages').scrollTop($('#messages').prop('scrollHeight')); 17 $('#send-message').val(''); 18} 19var socket = io.connect('http://localhost:3000'); 20 21$(document).ready(function() { 22 var chatApp = new Chat(socket); 23 24 // ルーム情報を送信 25 var selectRoom = 'testroom'; 26 socket.emit('from_client', { value: selectRoom }); 27 console.log("ルーム情報を配信: " + selectRoom); 28 29 // ルームに参加 30 socket.on('joinResult', function(result) { 31 console.log("ルームへ入室", result.room) 32 $("#room").text("接続しているルーム: " + result.room); 33 }); 34 35 // サーバから来たメッセージの受信 36 socket.on('from_server', function(data) { 37 clientChatMessage(chatApp, data.name, data.message); 38 }); 39 40 $("#send-message").focus(); 41 // 「送信」ボタンをクリック 42 $('#send-button').click(function() { 43 // フォームに入力したメッセージを取得 44 var message = $('#send-message').val(); 45 clientChatMessage(chatApp, "山田 次郎", message); 46 }); 47});

html

1// Chatクライアント 2<!DOCTYPE html> 3<html lang="en"> 4 5<head> 6 <meta charset="UTF-8"> 7 <title>chat</title> 8 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> 9 <link rel="stylesheet" type="text/css" href="css/chatStyle.css"> 10 <script src="/socket.io/socket.io.js" type="text/javascript"></script> 11 <script src="http://code.jquery.com/jquery-1.8.0.min.js" type="text/javascript"></script> 12 <script src="js/chat.js" type="text/javascript"></script> 13 <script src="js/chat_ui_client.js" type="text/javascript"></script> 14</head> 15 16<body> 17 <div class="panel-default"> 18 <div class="panel-heading"> 19 <p>チャットサンプル クライアント</p> 20 </div> 21 <div id='room'></div> 22 <div id="scroller" class="panel-body"> 23 <ul id='messages'></ul> 24 </div> 25 <form id="send-form"> 26 <div class="form-group"> 27 <label>メッセージ</label> 28 <input class="span11" id="send-message" type="text" placeholder="メッセージ内容を入力してください。"> 29 <button class="btn btn-primary" id="send-button" type="button">送信</button> 30 </div> 31 </form> 32 </div> 33</body> 34 35</html>

html

1// chatサーバ画面 2<!DOCTYPE html> 3<html lang="en"> 4 5<head> 6 <meta charset="UTF-8"> 7 <title>chat</title> 8 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> 9 <link rel="stylesheet" type="text/css" href="css/chatStyle.css"> 10 <script src="/socket.io/socket.io.js" type="text/javascript"></script> 11 <script src="http://code.jquery.com/jquery-1.8.0.min.js" type="text/javascript"></script> 12 <script src="js/chat.js" type="text/javascript"></script> 13 <script src="js/chat_ui.js" type="text/javascript"></script> 14</head> 15 16<body> 17 <div class="panel-default"> 18 <div class="panel-heading"> 19 <p>チャットサンプル</p> 20 </div> 21 <div id='room'></div> 22 <div id="scroller" class="panel-body"> 23 <ul id='messages'></ul> 24 </div> 25 <form id="send-form"> 26 <div class="form-group"> 27 <label>メッセージ</label> 28 <input class="span11" id="send-message" type="text" placeholder="メッセージ内容を入力してください。"> 29 <button class="btn btn-primary" id="send-button" type="button">送信</button> 30 </div> 31 </form> 32 </div> 33</body> 34 35</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

io.sockets.emit('receiveMessage', { name: name, message: message });

これは全員に送信するので、特定のroomにだけ送るには次のようにします。

js

1clientSocket.to(room).emit('receiveMessage', { name: name, message: message });

投稿2017/08/31 04:30

shimitei

総合スコア799

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

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

asakura

2017/09/04 12:02

ご指摘ありがとうございます。 指摘の通り、修正した所、想定通り特定のroomのみ送信ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問