在 socket.on() 之外的 Socket.emit()

Posted

技术标签:

【中文标题】在 socket.on() 之外的 Socket.emit()【英文标题】:Socket.emit() outside socket.on() 【发布时间】:2018-12-27 07:19:43 【问题描述】:

我们是否总是必须像这样在 socket.on() 中使用 socket.emit():

io.sockets.on('connection', function (socket) 
    console.log('User connected !');
    retrieveDictionnary((dictionnary) =>
     socket.emit('dictionnarySend', dictionnary);
    

我想在我的客户端创建一个函数,当我点击一个按钮时向服务器询问信息:

translateServer(parameter, control)
        this.socket.emit('translate', [parameter,control]);

但是好像不行,服务器从来没有收到这个消息。

谢谢!

【问题讨论】:

这个问题不完整。您需要显示更多客户端代码,以便我们可以看到您如何与服务器建立 socket.io 连接,如何存储 socket 变量等... 【参考方案1】:

您在上面使用的模式是与套接字交互的推荐方式(即在“连接”事件触发时获取socket 实例,然后从该套接字实例调用emit(),等等)。

如果我正确理解您的客户端要求,您希望通过 Web 套接字向服务器发送数据 - 您确定您已在客户端和服务器之间建立 Web 套接字连接的套接字吗?

例如,如果您将以下内容添加到客户端代码中,您应该会在控制台中看到一条成功消息:

const socket = io.connect('YOUR SERVER ADDRESS');

socket.on('connect', () => 
  console.log('connected to server!');

  // [UPDATE]
  // This assumes you have a <button> element on your page. When
  // clicked, a message will be sent to the server via sockets
  document.querySelector('button').addEventListener('click', (event) =>  

      // Prevent button click reloading page
      event.preventDefault();

      // Send message to server via socket
      socket.emit('MESSAGE_ID', 'test message from client' + new Date());
  );

);

更新

这显示了您的原始服务器代码,扩展了接收和打印通过套接字从客户端发送的数据所需的详细信息:

io.sockets.on('connection', function (socket) 
    console.log('User connected !');

    // Register a server handler for any messages from client on MESSAGE_ID channel
    socket.on('MESSAGE_ID', (message) => 

      // Print the message received from client in console  
      console.log('message from client', message);
    )

    retrieveDictionnary((dictionnary) =>
         socket.emit('dictionnarySend', dictionnary);
    

【讨论】:

是的,我有一些socket.on() 在我的客户端工作。我可以在客户端接收到来自服务器发送的socketdictionnarySend的信息。 我已经成功将数据从服务器发送到客户端,但不是在另一端

以上是关于在 socket.on() 之外的 Socket.emit()的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 发射在 socket.on 中不起作用

Socket.on() 监听任何事件

我应该在哪里调用 socket.on ?

与 Socket.io 反应 - 在“socket.on”事件上不断地重新渲染

socket.io 中 io.on 和 socket.on 的区别

Socket.io 服务器无法向客户端发送数据