当前位置: 首页 > 知识库问答 >
问题:

socket.to(socket.id)。emit()不起作用

魏凯捷
2023-03-14

试图在套接字中执行最简单的目标消息传递。io没有成功。根据插座文件。io与express。js中,您可以使用<code>socket.to(socket.id)将消息指向单个用户套接字。emit('事件名称','消息')

我已经读过套接字了。io文档从头到尾和其他堆栈溢出问答。我发现的一些解决方案涉及创建房间和传递这些房间的消息,但这个问题的目的是使用<code>socket.to(socket.id)向套接字id发送消息。emit('事件名称','消息'),如套接字中所示。io文档。

我使用的是节点v6.11.2、express4.15.2和套接字。io 2.0.3。

客户端和服务器代码几乎一字不差地取自https://socket.io/get-started/chat/在我实验的时候做了一些小的改变。

索引.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

    io.on('connection', function(socket){
        console.log(req.ip+' connected');
        socket.on('chat message', function(msg){
            console.log(socket.id);//logs the socket id. Something like 'AUCyM1tnpinCfvfeAAAB'
            console.log(msg);//logs whatever the message was, so I know the server is receiving the message
            socket.to(socket.id).emit('chat message', 'Nothing is happening here.');
        });
    });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

索引.html

<!doctype html>
<html>
    <head>
        <title>Socket.IO chat</title>
        <style>
          ...
        </style>
    </head>
    <body>
        <ul id="messages"></ul>
        <form action="">
            <input id="m" autocomplete="off" /><button>Send</button>
        </form>
        <script src="/socket.io/socket.io.js"></script>
        <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
        <script>
            $(function () {
                var socket = io();
                $('form').submit(function(){
                    socket.emit('chat message', $('#m').val());
                    $('#m').val('');
                    return false;
                });
                socket.on('chat message', function(msg){
                    $('#messages').append($('<li>').text(msg));
                });
            });
        </script>
    </body>
</html>

共有2个答案

仇阳州
2023-03-14

更改此:

socket.to(socket.id).emit('chat message', 'Your message');

对此:

io.to(socket.id).emit('chat message', 'Your message');

如果你愿意,你可以检查这个链接: https://socket.io/docs/emit-cheatsheet/

卫劲
2023-03-14

改变这一点:

socket.to(socket.id).emit(...)

对此:

socket.emit(...)

这里有一个解释。socket.to(socket.id). emit(…)将广播到名为socket.id的房间。没关系,有一个房间有这个名字,套接字是唯一的成员。但是,socket.to()发送给该房间的所有成员,只有EXCEPT套接字,所以没有人可以发送它。

因此,如果您只想发送到套接字,那么只需使用socket.emit()

以下是 socket.to()的 socket.io 文档中的引用:

为后续事件发射设置一个修饰符,该事件将仅广播给已加入给定房间(套接字本身被排除)的客户端。

 类似资料:
  • room (字符串) Return Socket for chaining 设置修改器,使得随后的事件导向这样的一种情况:即仅向当前房间的客户端广播消息(主动广播消息的一方除外)。 为了能对多个房间触发同一个广播,你需要给多个房间链式的执行几次to方法。 io.on('connection', (socket) => { // to one room socket.to('others')

  • (字符串) 标志socket session一个独一无二的符号,在客户端连接到服务器后被设置。 const socket = io('http://localhost'); console.log(socket.id); // undefined socket.on('connect', () => { console.log(socket.id); // 'G5p5...' });

  • (返回字符串) 一个独一无二的针对当前会话socket的标志,来自下行客户端。

  • 因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个

  • 问题内容: 正则表达式似乎还可以,因为第一行将子字符串正确替换为“ helloworld”,但是后者却不匹配,因为我看不到“ whynothelloworld?”。在控制台上 问题答案: 期望 整个 字符串匹配,而不仅仅是子字符串。 使用正则表达式匹配器对象的方法代替:

  • 正如Socket.IO 1.0中向特定ID发送消息中所给出的,可以通过使用 在我的Node.js应用程序中,我尝试做同样的事情。基本上,当用户提交另一个socket.id时,Node.js后端将把给定的数据发送给该特定的套接字ID。虽然前端将请求正确地提交给后端,但当我试图将数据发送到id时,它不会通过。代码中“断开”的部分如下所示: 当只使用io.emit而不是io.to(id).emit激发事