Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法在socket.io中正确更改房间_Node.js_Sockets_Express_Socket.io - Fatal编程技术网

Node.js 无法在socket.io中正确更改房间

Node.js 无法在socket.io中正确更改房间,node.js,sockets,express,socket.io,Node.js,Sockets,Express,Socket.io,我使用node&socket.io实现了聊天。它有服务器和客户端代码 chatApp.js "use strict"; let app = require('express')(); let server = require('http').Server(app); let io = require('socket.io')(server); app.get('/', (req, res) => { res.sendFile(__dirname + "/logs/chat2.html

我使用node&socket.io实现了聊天。它有服务器和客户端代码

chatApp.js

"use strict";
let app = require('express')();
let server = require('http').Server(app);
let io = require('socket.io')(server);

app.get('/', (req, res) => {
  res.sendFile(__dirname + "/logs/chat2.html");
});

io.on("connect", (socket) => {
  // New user
  socket.emit("userSelfNotification", {text: "--SELF-- You joined server"});
  socket.broadcast.emit("newUserNotification", {text: "--BROADCAST-- New user"});
  // Send sms
  socket.on("message", (message) => {
    io.sockets.emit("newMessage", {text: message});
  });
  // Change room
  socket.on("changeRoom", (room) => {
    socket.room = room;
    socket.broadcast.emit("leaveRoom", {text: "--BROADCAST-- user left "});
    socket.join(room);
    socket.in(room).emit("roomChangeNotification", {text: "--ROOM-- You left"});
    io.sockets.in(room).emit("newUserNotification", {text: "--ROOM_ALL-- New user joined"});
  });
});

server.listen(3000);
client.html

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Чат</title>
    <script src="https://code.jquery.com/jquery-3.1.0.min.js" charset="utf-8"></script>
    <script src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script>
      let socket = io('http://localhost:3000/');
      socket.on("userSelfNotification", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
      socket.on("newUserNotification", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
      socket.on("newMessage", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
      socket.on("leaveRoom", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
      socket.on("roomChangeNotification", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
      socket.on("newUserNotification", (message) => {
        $("textarea").val($("textarea").val() + message.text + "\n");
      });
    </script>
</head>
<body>
<textarea name="name" rows="15" cols="50"></textarea>
<p></p>
<input type="text" name="text" size="20">
<button type="button" name="button">Отправить</button>
<button type="button" name="changeRoomButton">Сменить комнату</button>
<script>
  $(document).on('click', 'button', () => {
    let message = $('input').val();
    socket.emit("message", message);
    $('input').val(null);
  });
  $(document).ready(function(){
    $("[name='changeRoomButton']").click(function(){
      $(".test").hide();
      console.log("I work babeee");
      socket.emit("changeRoom", "room");
    });
  });
</script>    
</body>
</html>

Чат
让socket=io('http://localhost:3000/');
socket.on(“userSelfNotification”,(message)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});
socket.on(“newUserNotification”,(message)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});
socket.on(“newMessage”,(message)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});
socket.on(“leaveRoom”,(消息)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});
socket.on(“roomChangeNotification”(消息)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});
socket.on(“newUserNotification”,(message)=>{
$(“textarea”).val($(“textarea”).val()+message.text+“\n”);
});

Отправить Сменить комнату $(文档)。在('单击','按钮',()=>{ let message=$('input').val(); 发出(“消息”,消息); $('input').val(null); }); $(文档).ready(函数(){ $(“[name='changeRoomButton']”)。单击(函数(){ $(“.test”).hide(); console.log(“我在巴贝工作”); 插座。发射(“更衣室”、“房间”); }); });
主要问题是我无法实现文件室更改:即使用户更改了文件室,他/她仍然可以向其他默认文件室写入内容并从中读取其他消息。此外,两个房间都会发出一些事件


帮我理解哪里是我的错,谢谢

由于套接字客户端可以订阅多个房间,如果您希望客户端一次只能在一个房间中,则必须执行
。加入新房间时,请将
保留在中

访问客户端订阅的房间名的实际方法是使用:
socket.rooms

但是,由于您没有订阅(加入)/取消订阅(离开)多个频道(房间),并且一次只有一个活动房间,因此您可以调用:然后执行
socket.join(房间)

例如,如果您想在客户端断开连接时发出通知,则必须在
断开连接时发出通知,因为在
断开连接时已调用了leaveAll():

socket.on('disconnect', function(){(
    /*
      socket.rooms is empty here 
      leaveAll() has already been called
    */
 });
 socket.on('disconnecting', function(){
   // socket.rooms should isn't empty here 
   var rooms = socket.rooms.slice();
   /*
     here you can iterate over the rooms and emit to each
     of those rooms where the disconnecting user was. 
   */
 });

谢谢你的回答:每一个都似乎是半正确的,但太抽象了。我通过将“socket.room”重新分配给我希望加入的房间解决了这个难题。此块解决了以下问题:

// Change room
socket.on("changeRoom", (room) => {
    socket.in(defaultRoom).broadcast.emit("leaveRoom", {text: "--BROADCAST-- User left room"});
    socket.leave(defaultRoom);
    socket.room = room;
    socket.join(room);
    socket.emit("roomChangeNotification", {text: "--ROOM-- You changed room"});
    socket.in(room).broadcast.emit("OnewUserNotification", {text: "--ROOM_ALL-- New user joined"});
  });
因此: 1.我添加了默认房间,并自动加入了每个连接到服务器的用户
2.我添加了将socket.room参数从“defaultRoom”重新分配到名为“room”的自定义房间的代码。就这样。

这不是很好。。。。每次你换房间
socket.leave(defaultRoom)时,它总是离开defaultRoom(你第一次换衣服时已经离开的房间)
并且您不会真正离开您加入的新房间,因此如果您要使用此策略,您需要执行
socket.room=defaultRoom
(连接时),然后在更衣室事件中,您必须修改
socket.leave(defaultRoom)用于插座.离开(插座.房间)
使用
socket.leaveAll
,然后使用
socket.join(room)
(因为您只希望您的客户一次订阅一个房间),这将比我在回答中所说的简单得多