【问题标题】:Socket.IO client event handler not called?未调用 Socket.IO 客户端事件处理程序?
【发布时间】:2017-09-12 03:24:39
【问题描述】:

我是一名 iOS 开发人员,最近开始使用 Socket.IO。在我的 iOS 应用程序的生命周期中,我的服务器将作为客户端从我的应用程序接收消息,但对于一种特殊情况,服务器还需要作为客户端从 Web 浏览器接收消息。我正在测试一个非常基本的浏览器 UI,其中包括一个文本字段和一个按钮,点击该按钮,需要将一个数字代码(在文本字段中输入)发送到服务器。看起来是这样的:

<form>
  Code:<br>
  <input type="text" id="code" name="code"><br>
  <input type="submit" id="validatebutton" value="Validate">
  <script src="/socket.io-client/dist/socket.io.js"></script>
  <script>
    document.getElementById("validatebutton").onclick = function() {
      var socket = io('http://localhost:3000');
      socket.on('connect', function(clientSocket) {
        clientSocket.emit('validateCode', document.getElementById("code"));
      });
    };
  </script>
</form>

连接正常。当我运行此代码时,客户端成功连接到侦听套接字服务器。唯一的问题是事件处理程序没有被执行。我可能不太喜欢这里,但我选择的是客户端事件处理程序,它包含在 Swift SDK 中:

self.socket.on(clientEvent: .connect, callback: { (data:[Any], ack:SocketAckEmitter) in
    // Do something here
})
self.socket.connect()

我只是假设 Javascript 客户端也有一个客户端事件处理程序(名为 'connect'),它在连接到服务器时由客户端接收。就像我说的,我可能会离开这里。我只是关注他们网站上发布的 Socket.IO 文档,它告诉我这样做。如果有人能告诉我我错过了什么,或者我做错了什么,将不胜感激。对不起所有的noobishness,但我真的不知道该转向哪里,因为官方文档非常模糊,而且Stack上的其他问题对我来说有点太高级了。

【问题讨论】:

    标签: socket.io


    【解决方案1】:

    我不会将emit 函数放在连接中。尝试在您的客户端中进行如下发射

      <script>
        var socket = io('http://localhost:3000');
        document.getElementById("validatebutton").onclick = function() {
           socket.emit('validateCode', document.getElementById("code"));
        };
      </script>
    

    您的 click 事件可能正在执行,但发出不是因为它被包装在 connect 函数中(仅当套接字连接到服务器时才会执行)

    我也会把 JavaScript 放在它自己的文件中,但现在,至少在表单(不在它里面)可以工作之后。

    【讨论】:

    • 谢谢,成功了!它确实稍微改变了这个过程,因为我最初是为了快速连接,客户端只发出消息,然后立即再次与服务器断开连接,这就是套接字连接最初位于 onclick 函数内的原因。不过,这也同样有效,所以一切都很好。此外,据我所知,Javascript 客户端似乎没有 .connect.disconnect 函数,这与 Swift 客户端不同,所以我可能不会只是在发出无论如何都要留言。
    • 最后一个(不相关的)问题:如何向多个连接的客户端发送消息?我知道如何向特定客户端发送消息,但是否也可以传递一组客户端以向其发送消息?现在我正在尝试(在服务器端):io.to(sockets.join()).emit("myMessage", someData); 但这似乎没有做任何事情。奇怪的是,我也没有收到错误,所以我完全不知道这是对还是错。
    • 这是一个 node.js 示例。在服务器端发送给所有客户端,你可以做一些简单的事情,比如var io = require('socket.io')(http); 然后io.emit("myIdentifier", myData);。至于只发送给一部分连接的客户端,我不确定,抱歉。
    • 没关系,我已经知道了。如果您想向特定的客户端组发送,您只需创建房间。首先,您使用clientSocket.join('myRoom'); 将客户端添加到该房间,当您想要向已添加到该房间的每个客户端发射时,您只需使用io.to('myRoom').emit('myMessage', someData);。就那么简单。再次感谢所有的帮助!欣赏它。
    猜你喜欢
    • 2012-05-11
    • 2017-05-18
    • 2014-04-22
    • 2015-04-30
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多