2013-10-03 15 views
15

tôi có thể yêu cầu sự giúp đỡ của bạn không. Mã của tôi không hoạt động để tạo phòng bằng socket.room, đầu tiên tôi đã khai báo var rooms = ['Lobby']; và tôi muốn tạo phòng và đẩy tên phòng đã tạo thành rooms[]. Mục tiêu của tôi là cho phép người dùng tạo phòng riêng của họ và xóa nó nếu có thể. Tôi đã sử dụng mã của Michael Mukhin here làm tài liệu tham khảo.Node.js và Socket.io Creating Room

Đây là mã của server.js tôi

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); 
    }); 
}); 

Đây là mã trong các khách hàng index.html Tôi muốn tạo ra một căn phòng và thêm nó vào danh sách các 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> 

Hãy giúp các bạn tôi đã đọc tài liệu socket.io. Nhưng tôi thấy khó hiểu. Tôi hy vọng bạn có thể giúp tôi. Cảm ơn trước, tôi xin lỗi nhưng tôi vẫn đang học socket.io và node.js. Cảm ơn.

+0

đâu là mã cho nút bạn bấm vào để tạo một căn phòng mới? Bên cạnh đó, 'socket.on ('createroom', ...); 'có vẻ lạ với tôi, vì bên sever bạn không bao giờ phát ra' createroom '. – warchimede

+0

Tôi đang gặp khó khăn để hiểu socket.io, tôi nên sửa chữa dòng nào? –

+0

Vui lòng tham khảo câu trả lời của tôi :) – warchimede

Trả lời

32

này có thể giúp:

server.js (không có mã về 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

Cảm ơn sgwilly. Tôi quên kiểm tra stackoverflow một lúc trước. Tôi đã thử mã của bạn nhưng phòng tạo không hiển thị>.

+0

hi @sgwilly u có thể giúp tôi hiểu io.sockets.emit ('updateusers', tên người dùng); hoạt động trong socket.on ('disconnect', function() {}); bởi vì không có bất kỳ io.sockets.on ('updateusers', function() {}); trong mã máy khách – Fadi

+0

Tôi nghĩ bạn có thể muốn thêm 'socket.broadcast.emit' vào' socket.on ('create', function (room) {...} 'để thông báo cho các khách hàng khác về một căn phòng mới khi nó có đã được tạo. –

Các vấn đề liên quan