2013-10-03 58 views
15

我可以請求您的幫助。我的代碼不適用於使用socket.room創建房間,首先我已聲明var rooms = ['Lobby'];,並且我想創建房間並將創建的房間名稱推送至rooms[]。我的目標是允許用戶創建自己的房間並儘可能刪除它。我用Michael Mukhin here的代碼作爲參考。Node.js和Socket.io創建空間

這裏是我的server.js的代碼

var redis = require('redis'); 
var express = require('express'); 
var app = express(); 
var http = require('http'); 
var server = http.createServer(app); 
var io = require('socket.io').listen(server); 
var publish = redis.createClient(); 
var subscribe = redis.createClient(); 

server.listen(8080); 


app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

var usernames = {}; 

var rooms = ['Lobby']; 

io.sockets.on('connection', function (socket) { 

    socket.on('adduser', function (username){ 
     socket.username = username; 
     socket.room = 'Lobby';   
     usernames[username] = username; 
     socket.join('Lobby');   
     subscribe.subscribe(socket.room); 
     socket.emit('updatechat', 'SERVER', 'you have connected to Lobby'); 
     socket.broadcast.to('Lobby').emit('updatechat', 'SERVER', username + ' has connected to this room'); 
     socket.emit('updaterooms', rooms, 'Lobby'); 
    }); 

    socket.on('create', function (room) { 
     var room = 'test'; 
     rooms.push(room); 
     }); 

    socket.on('sendchat', function (data) { 

     io.sockets.in(socket.room).emit('updatechat', socket.username, data); 
     if (socket.room === 'Lobby') { 
      publish.publish('Lobby', data); 
     } else { 
     publish.publish(socket.room, data); 
     } 
    }); 

    socket.on('switchRoom', function(newroom){ 
     socket.leave(socket.room); 
     socket.join(newroom); 
     subscribe.subscribe(newroom); 
     socket.emit('updatechat', 'SERVER', 'you have connected to '+ newroom); 
     socket.broadcast.to(socket.room).emit('updatechat', 'SERVER', socket.username+' has left this room'); 
     socket.room = newroom; 
     socket.broadcast.to(newroom).emit('updatechat', 'SERVER', socket.username+' has joined this room'); 
     socket.emit('updaterooms', rooms, newroom); 
    }); 



    socket.on('disconnect', function(){ 

     delete usernames[socket.username]; 
     io.sockets.emit('updateusers', usernames); 
     socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected'); 
     socket.leave(socket.room); 
    }); 
}); 

這裏是在客戶端代碼的index.html 我想創建一個房間,並把它添加到的rooms[]列表。

<script src="/socket.io/socket.io.js"></script> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080'); 


    socket.on('connect', function(){ 

     socket.emit('adduser', prompt("What's your name: ")); 
     test(); 
    }); 


     //this is my create room to be called when i click a button 
     socket.on('createroom', function() { 
      socket.emit('create', room); 
     }); 




    socket.on('updatechat', function (username, data) { 
     $('#conversation').append('<b>'+ username + ':</b> ' + data + '<br>'); 
    }); 


    socket.on('updaterooms', function (rooms, current_room) { 
     $('#rooms').empty(); 
     $.each(rooms, function(key, value) { 
      if(value == current_room){ 
       $('#rooms').append('<div>' + value + '</div>'); 
      } 
      else { 
       $('#rooms').append('<div><a href="#" onclick="switchRoom(\''+value+'\')">' + value + '</a></div>'); 
      } 
     }); 
    }); 

    function switchRoom(room){ 
     socket.emit('switchRoom', room); 
    } 


    $(function(){ 
     $('#datasend').click(function() { 
      var message = $('#data').val(); 
      $('#data').val(''); 
      socket.emit('sendchat', message); 
     }); 


     $('#data').keypress(function(e) { 
      if(e.which == 13) { 
       $(this).blur(); 
       $('#datasend').focus().click(); 
      } 
     }); 
    }); 

</script> 
<div style="float:left;width:100px;border-right:1px solid black;height:300px;padding:10px;overflow:scroll-y;"> 
    <b>ROOMS</b> 
    <div id="rooms"></div> 
</div> 

<div style="float:left;width:300px;height:250px;overflow:scroll-y;padding:10px;"> 
    <div id="conversation"></div> 
    <input id="data" style="width:200px;" /> 
    <input type="button" id="datasend" value="send" /> 
</div> 

請幫幫我們我已經閱讀過socket.io文檔。但我發現很難理解。我希望你能幫助我。在此先感謝,我很抱歉,但我仍然在學習socket.io和node.js.謝謝。

+0

其中,是按鈕,你的代碼點擊創建一個新房間?另外,'socket.on('createroom',...);'對我來說似乎很陌生,因爲切斷邊你永遠不會排出'創作者'。 – warchimede

+0

我很難理解socket.io,我應該修補哪一行先生? –

+0

請參閱我的回答:) – warchimede

回答

32

這可能會幫助:

server.js(沒有關於Redis的代碼)

var usernames = {}; 

var rooms = ['Lobby']; 

io.sockets.on('connection', function(socket) { 
    socket.on('adduser', function(username) { 
     socket.username = username; 
     socket.room = 'Lobby'; 
     usernames[username] = username; 
     socket.join('Lobby'); 
     socket.emit('updatechat', 'SERVER', 'you have connected to Lobby'); 
     socket.broadcast.to('Lobby').emit('updatechat', 'SERVER', username + ' has connected to this room'); 
     socket.emit('updaterooms', rooms, 'Lobby'); 
    }); 

    socket.on('create', function(room) { 
     rooms.push(room); 
     socket.emit('updaterooms', rooms, socket.room); 
    }); 

    socket.on('sendchat', function(data) { 
     io.sockets["in"](socket.room).emit('updatechat', socket.username, data); 
    }); 

    socket.on('switchRoom', function(newroom) { 
     var oldroom; 
     oldroom = socket.room; 
     socket.leave(socket.room); 
     socket.join(newroom); 
     socket.emit('updatechat', 'SERVER', 'you have connected to ' + newroom); 
     socket.broadcast.to(oldroom).emit('updatechat', 'SERVER', socket.username + ' has left this room'); 
     socket.room = newroom; 
     socket.broadcast.to(newroom).emit('updatechat', 'SERVER', socket.username + ' has joined this room'); 
     socket.emit('updaterooms', rooms, newroom); 
    }); 

    socket.on('disconnect', function() { 
     delete usernames[socket.username]; 
     io.sockets.emit('updateusers', usernames); 
     socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected'); 
     socket.leave(socket.room); 
    }); 
}); 

的index.html

<head> 
... // your other code 
<script> 
var socket = io.connect('http://localhost:8000'); 

socket.on('connect', function(){ 
    socket.emit('adduser', prompt("What's your name: ")); 
}); 

socket.on('updatechat', function (username, data) { 
    $('#conversation').append('<b>'+ username + ':</b> ' + data + '<br>'); 
}); 


socket.on('updaterooms', function (rooms, current_room) { 
    $('#rooms').empty(); 
    $.each(rooms, function(key, value) { 
     if(value == current_room){ 
      $('#rooms').append('<div>' + value + '</div>'); 
     } 
     else { 
      $('#rooms').append('<div><a href="#" onclick="switchRoom(\''+value+'\')">' + value + '</a></div>'); 
     } 
    }); 
}); 

function switchRoom(room){ 
    socket.emit('switchRoom', room); 
} 

$(function(){ 
    $('#datasend').click(function() { 
     var message = $('#data').val(); 
     $('#data').val(''); 
     socket.emit('sendchat', message); 
    }); 

    $('#data').keypress(function(e) { 
     if(e.which == 13) { 
      $(this).blur(); 
      $('#datasend').focus().click(); 
     } 
    }); 

    $('#roombutton').click(function(){ 
     var name = $('#roomname').val(); 
     $('#roomname').val(''); 
     socket.emit('create', name) 
    }); 
}); 

</script> 
</head> 
<body> 
    <div style="float:left;width:100px;border-right:1px solid black;height:300px;padding:10px;overflow:scroll-y;"> 
     <b>ROOMS</b> 
     <div id="rooms"></div> 
    </div> 

    <div style="float:left;width:300px;height:250px;overflow:scroll-y;padding:10px;"> 
     <div id="conversation"></div> 
     <input id="data" style="width:200px;" /> 
     <input type="button" id="datasend" value="send" /> 
    </div> 

    <div style="float:left;width:300px;height:250px;overflow:scroll-y;padding:10px;"> 
     <div id="room creation"></div> 
     <input id="roomname" style="width:200px;" /> 
     <input type="button" id="roombutton" value="create room" /> 
    </div> 
    ... // the rest of your page 
</body> 
+0

謝謝sgwilly。前段時間我忘了檢查stackoverflow。我試過你的代碼,但創建空間不顯示>。<我會嘗試再次檢查它。謝謝。 –

+0

hi @sgwilly你能幫我理解io.sockets.emit('updateusers',用戶名)嗎?在socket.on('disconnect',function(){});因爲沒有任何io.sockets.on('updateusers',function(){});在客戶端代碼 – Fadi

+0

我想你可能想在'socket.on('create',function(room){...}''中添加'socket.broadcast.emit',以便一旦有新房間時通知其他客戶端被創建。 –