当前位置: 首页 > 面试题库 >

具有Socket.io和Node的动态房间

松越
2023-03-14
问题内容

我正在尝试使用Socket.io
v.7中的新“会议室”功能来创建动态聊天室,但是在我的示例中无法使静态会议室正常工作。用户根据URL选择应该以room1或room2结尾。用户在聊天室中输入的任何内容都应广播给同一房间的用户。我有2个浏览器(chrome和ff),每个浏览器都有一个打开到/
room1和/ room2的选项卡,但是我键入的内容似乎不会广播到其他选项卡。我究竟做错了什么?

服务器代码

var app = require('express').createServer();
var io = require("socket.io").listen(app);

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

    // join to room and save the room name
    socket.on('join room', function (room) {
        socket.set('room', room, function() { console.log('room ' + room + ' saved'); } );
        socket.join(room);
    })

    socket.on('message', function(data) {
        console.log("Client data: " + data);

        // lookup room and broadcast to that room
        socket.get('room', function(err, room) {
            //room example - https://github.com/learnboost/socket.io
            // neither method works for me
            socket.broadcast.to(room).emit('new fan');
            io.sockets.in(room).emit('new non-fan');
        })
    })
});

app.get('/room1', function(req, res){       
    res.render('example2-client.ejs', {layout:false});
});

app.get('/room2', function(req, res){       
    res.render('example2-client-2.ejs', {layout:false});
});

app.listen(4000);

客户代码室1

<!DOCTYPE HTML>
<html><head>
<title>Code review for Snipet</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="http://localhost:4000/socket.io/socket.io.js"></script>
<script>
$(document).ready(function() { 
    var socket = io.connect('http://localhost:4000');

    $("#msgbox").keypress( function(event) {
         if (event.which == '13') {
            sendmsg();
            event.preventDefault();
        }
    });

    socket.on('connect', function (data) {
        socket.emit('join room', 'room1' );
    });

    socket.on('message', function (data) {
        add_message(data);
    });

    function add_message(m) {
        $("#chatlog").append(m);
        $("#chatlog").append("<BR>");
    }

    function sendmsg()
    {
        var r = $("#msgbox").val();
        socket.emit('message', r );
        add_message(r);
        $("#msgbox").val('');
    }

});
</script>
</head>
<body>
<div id="chat" style="height: 200px; width: 200px; border: 1px solid grey;">
<div id="chatlog" style="height: 178px; width: 200px; overflow-y: scroll;"></div>
<input type="text" id="msgbox" style="margin-left: 2px; width: 193px;">
</div>
</body>
</html>

客户代码2

<!DOCTYPE HTML>
<html><head>
<title>Code review for Snipet</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="http://localhost:4000/socket.io/socket.io.js"></script>
<script>
$(document).ready(function() { 
    var socket = io.connect('http://localhost:4000');

    $("#msgbox").keypress( function(event) {
         if (event.which == '13') {
            sendmsg();
            event.preventDefault();
        }
    });

    socket.on('connect', function (data) {
        socket.emit('join room', 'room2' );
    });

    socket.on('message', function (data) {
        add_message(data);
    });

    function add_message(m) {
        $("#chatlog").append(m);
        $("#chatlog").append("<BR>");
    }

    function sendmsg()
    {
        var r = $("#msgbox").val();
        socket.emit('message', r );
        add_message(r);
        $("#msgbox").val('');
    }

});
</script>
</head>
<body>
<div id="chat" style="height: 200px; width: 200px; border: 1px solid grey;">
<div id="chatlog" style="height: 178px; width: 200px; overflow-y: scroll;"></div>
<input type="text" id="msgbox" style="margin-left: 2px; width: 193px;">
</div>
</body>
</html>

问题答案:

您似乎没有在听这些事件

socket.broadcast.to(room).emit('new fan');
io.sockets.in(room).emit('new non-fan');

在客户端,您需要:

socket.on('new fan', function (data) {
    console.log('new fan');
});

您也不会将消息发送给客户端。内:

socket.on('message', function(data) { })

在服务器上,您需要执行以下操作:

io.sockets.in(room).emit('message', data);


 类似资料:
  • 问题内容: Socket.io的自述文件包含以下示例: 和之间有什么区别? 问题答案: 广播在给定房间中所有的插座, 除外 到它被调用而插座广播在给定房间内的所有插座。

  • 我有一些问题要执行。 我需要的: 发布来自用户的消息 将其广播给其他用户 将消息发送给将在下次连接时使用该消息的脱机用户 我实际上: 在index.html页上,我连接到套接字服务器 我有一个发送消息的按钮 我在索引页上打开两个不同的浏览器,我的用户都已连接起来 如果我向服务器发送消息,服务器就会将消息发送给其他用户 如果我向服务器发送第二条消息,它就会将该消息发送给发送该消息的用户。 它在切换,

  • 问题内容: 我有一个具有动态架构的YAML结构,例如,我可以具有以下yaml: Goyaml将yaml映射到Go结构,该结构应声明确定的类型。在这里,它是一个符号号,或者是一个数组,甚至是一个映射。 哪种情况最适合这种情况? 问题答案: 我决定添加一个显示类型断言的答案,而不是包装。您可以决定最适合您的应用程序。我个人更喜欢内置函数,而不是软件包的复杂性。

  • 问题内容: 我想请你帮忙。我在socket.io的客户端上遇到了麻烦,我想在客户端调用此代码以在socket.io中创建一个房间: 我不知道这是否正确,如果不正确,请帮助我纠正这些家伙。我不是在节点js和套接字方面专业,但我已经阅读了他们的wiki。有没有可能创造空间的方法? 问题答案: 不需要创建Socket.IO中的房间,而是在套接字加入时创建一个房间。它们是在服务器端加入的,因此您必须指示服

  • 问题内容: 我正在尝试通过构建一组动态创建的聊天室来学习Socket.io,这些聊天室在用户进入和离开时会发出“已连接”和“已断开”消息。看着问题,我已经把一些功能,但大多数链接的响应是从谁承认自己已成功侵入一起答案的人,我已经注意到有一个更普遍的-和最近- 有关的权利的方式来讨论在Socket.io存储库上执行此操作(尤其是在此处和此处) 因为我是个新手,所以我不知道下面的工作是否是可以接受的处

  • 问题内容: 我正在研究nodejs / socket.io的实时聊天,并且需要一些有关实施会议室的建议。 使用名称空间或使用房间功能来完全隔离颤抖的对方,哪个更好? 房间和名称空间之间真正的技术区别是什么? 资源使用方面有区别吗? 问题答案: 这是名称空间和房间 的共同点 (socket.io v0.9.8-请注意,v1.0涉及完整的重写,因此情况可能有所更改): 命名空间(io.of(’/ ns