2017-01-11 9 views
0

私はそれ以外の場合は、何もしない、「joinedRoom」リスナーがクライアントによってトリガーされると、私はjoinedRoomリスナーの外に私のコードを配置する場合、コードは正常に動作し、特定の部屋にmesssageを放出しようとしているNode.js Socket.io - 別のリスナー内のソケットルームにメッセージを送信するにはどうすればいいですか?

のコード。:

app.get('/room/:room/user/:user', function(req, res){ 
    var room = { 
     username: req.params.user, 
     roomname: req.params.room 
    }; 
    res.render('room', room); 
}); 

var users = {}; 

io.sockets.on('connection', function (socket) { 
    socket.on('joinedRoom', function(roomData){ 
     socket.username = roomData.username; 
     socket.room = roomData.roomname; 

     console.log("Roomname: " + socket.room); 
     console.log("Username: " + socket.username); 

     socket.join(socket.room); 
     socket.broadcast.to(socket.room).emit('newUser', socket.username); 

     socket.on('disconnect', function(){ 
      socket.broadcast.emit('userLeft', socket.username); 
      socket.leave(socket.room); 

      console.log('Connection id: ' + socket.id); 
     }); 
    }); 
}); 

クライアントコード:

var socket, roomname, ioRoom; 
var socket = io.connect('http://localhost:3000'); 

socket.on('enterRoom', function(roomname){ 
    console.log("ENTERED ROOM: " + roomname); 
}); 

socket.on('newUser', function(username){ 
    pushUserName(username); 
    pushUserStatus(username, ' has joined the room <br/>') 
}); 

socket.on('newRoom', function(data){ 
    alert(data) 
}); 

socket.on('userLeft', function(username){ 
    pushUserStatus(username, ' has left the room <br/>') 
}) 

function pushUserName(username){ 
    var el = document.getElementById("username"); 
    el.innerHTML += username + '<br/>'; 
} 

function pushUserStatus(username, message){ 
    var el = document.getElementById("joined"); 
    el.innerHTML += username + message; 
} 

コードが発する "joinedRoom" イベント:

doctype html 
head 
    title Sala #{roomname} 

    script(src="https://cdn.socket.io/socket.io-1.4.5.js") 
    script(type="text/javascript"). 
     var socket = io.connect('http://localhost:3000'); 
     var roomData = { 
      roomname: '#{roomname}', 
      username: '#{username}' 
     } 
     socket.emit('joinedRoom', roomData); 

    script(src="../../../js/room.js") 

    body 
     p#joined 
     h1 Room's name: #{roomname} 

     h2 Your nickname: #{username} 

     h2 Players: 

     p#username.player-row 

私はドキュメントといくつかのサンプルコードを見ましたが、すべてが正しいと思われます(それは単に構文になると思います)。

ありがとうございます!

答えて

0

接続イベントリスナーの外で切断イベントリスナーを登録する必要があると思います。

コード:の代わりに

socket.emit('joinedRoom', roomData); 

は次のようになります。コードはほとんどが正しいが、私はこれを欠落していたある同様の問題がある可能性があります人のために

app.get('/room/:room/user/:user', function(req, res){ 
    var room = { 
     username: req.params.user, 
     roomname: req.params.room 
    }; 
    res.render('room', room); 
}); 

var users = {}; 

io.sockets.on('connection', function (socket) { 
    socket.on('joinedRoom', function(roomData){ 
     socket.username = roomData.username; 
     socket.room = roomData.roomname; 

     console.log("Roomname: " + socket.room); 
     console.log("Username: " + socket.username); 

     socket.join(socket.room); 
     socket.broadcast.to(socket.room).emit('newUser', socket.username); 
    }); 
    socket.on('disconnect', function(){ 
     // need more logic here 
    }); 
}); 
+0

こんにちは@Yod楽しい事実が、私はjoinedRoomリスナーを削除した場合、完全にそれが動作である、あなたの助けのおかげで、私はあなたがお勧めするものでしたが、それはうまくいきませんでした.... – user309838

0

socket.on('connect', function(){ 
    socket.emit('joinedRoom', roomData); 
}) 

:)

関連する問題