【问题标题】:socket.io - 'connect' event does not fire on the clientsocket.io - 'connect' 事件不会在客户端触发
【发布时间】:2012-04-19 07:31:07
【问题描述】:

我正在尝试开始使用 node.js 和 socket.io。
我有一个非常(非常)简单的客户端-服务器测试应用程序,但我无法让它工作。
该系统设置在一台装有 apache 服务器的 windows 机器上。
apache 在port 81 上运行,socket.io 设置为监听port 8001

服务器 - server.js

var io = require('socket.io').listen(8001);

io.sockets.on('connection', function (socket) {
    console.log('\ngot a new connection from: ' + socket.id + '\n');
});

客户端 - index.html

<!DOCTYPE html>
<html>
<head>
    <title>node-tests</title>
    <script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js">    </script>
    <script type="text/javascript">
        var socket = io.connect('http://localhost', { port: 8001 });

        socket.on('connect', function () {
            alert('connect');
        });

        socket.on('error', function (data) {
            console.log(data || 'error');
        });

        socket.on('connect_failed', function (data) {
            console.log(data || 'connect_failed');
        });
    </script>
</head>
<body>

</body>
</html>

使用node server.js 启动我的服务器后,标准(预期)输出将写入服务器控制台:

info: socket.io started

当我在浏览器中打开 index.html(我的情况是 chrome - 未在其他浏览器上测试)时,以下日志将写入服务器控制台:

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 9952353481638352052
debug: setting request GET /socket.io/1/websocket/9952353481638352052
debug: set heartbeat interval for client 9952353481638352052
debug: client authorized for

got a new connection from: 9952353481638352052

debug: setting request GET /socket.io/1/xhr-polling/9952353481638352052?t=1333635235315
debug: setting poll timeout
debug: discarding transport
debug: cleared heartbeat interval for client 9952353481638352052
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635238316&i=0
debug: setting poll timeout
debug: discarding transport
debug: clearing poll timeout
debug: clearing poll timeout
debug: jsonppolling writing io.j[0]("8::");
debug: set close timeout for client 9952353481638352052
debug: jsonppolling closed due to exceeded duration
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635258339&i=0
...
...
...

在浏览器控制台中我得到:

connect_failed

所以看起来客户端正在到达服务器并尝试连接,并且服务器正在授权握手,但客户端中从未触发 connect 事件,而是连接方法到达其 connect timeout 和 @987654332 @并放弃返回connect_failed

对此的任何帮助\见解都会有所帮助。

谢谢

【问题讨论】:

  • 尝试仅使用 io.connect() 它可以从您所在的 url 推断 URL 和端口。过去我遇到过问题,io.connect 中的东西没有像我期望的那样工作。
  • @kfiroo 你有解决办法吗?
  • @TimothyStrimple 谢谢蒂姆! 再次在 heroku (Cedar) 和 localhost 上工作

标签: javascript node.js socket.io


【解决方案1】:

确保客户端和服务器的 socket.io 主版本相同。例如,服务器上的socket.io@2.3.0 和客户端上的socket.io-client@3.x.x 组合会导致这种情况,并且不会调度'connect' 事件。

【讨论】:

  • 为我工作 :)
  • 被低估的答案。客户端和服务器的版本不同,这修复了它
  • 我遇到了这个问题,无法访问后端的套接字版本。我必须测试所有,直到找到正确的。但是可以,谢谢
  • 通常情况下,这就是解决方案。
【解决方案2】:
//Client side
<script src="http://yourdomain.com:8001/socket.io/socket.io.js"></script>
var socket = io.connect('http://yourdomain.com:8001');

//Server side
var io = require('socket.io').listen(8001);
io.sockets.on('connection',function(socket) {
`console.log('a user connected');`
});

客户端: 客户端代码从为您提供服务器端 socketIO 的同一文件请求客户端版本的套接字 IO。 var socket 现在将拥有 socketIO 可用的所有方法,例如 socket.emit 或 socket.on

服务器端: 与客户端相同,使 socketIO 方法可在 var io 下使用。

【讨论】:

  • 欢迎来到 StackOverflow。你能解释一下这段代码吗?它可能对未来的访问者有所帮助。
  • 这是使用 node.js 连接的最简单的方法。
【解决方案3】:

前端(客户端)的变化:

var socket = io.connect(http://myapp.herokuapp.com);

var socket = io.connect();

在处理各种客户端(Chrome、Firefox 浏览器和 Phonegap 应用程序)后,这些客户端没有正确注册与服务器的连接(即 服务器在其日志中成功注册了 websocket 连接,但前端没有注册连接事件),我从 cmets 尝试了 @Timothy 的解决方案,现在一切在 heroku 和 localhost 上再次运行。

【讨论】:

    【解决方案4】:

    使用 socketio 2.3.0 你必须使用 socket.on('connect')

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io({
            transports: ['polling']
        });
        console.log("created",socket);
        socket.on('connect', function(data){ // <-- this works
            console.log("socket ON connect",data);
        });
        socket.on('connection', function(data){ // <-- this fails
            console.log("socket ON connection",data);
        });
    
    </script>
    

    【讨论】:

    • 在 2.1.0 上。我认为它是 socket-client 2+ 上的“连接”,但我现在无法确认。
    【解决方案5】:

    在创建时使用autoConnect: false 选项:io(... { autoConnect: false }),订阅您的事件并调用io.connect()

    【讨论】:

      【解决方案6】:

      尝试以下方法:

      改变

      var socket = io.connect('http://localhost', { port: 8001 });
      

      var socket = io.connect('http://localhost:8001');
      

      【讨论】:

        【解决方案7】:

        试试这个:

        Server.js

        var http = require("http").createServer(), io = require("socket.io").listen(http);
        
        http.listen(8001);
        
        io.sockets.on("connection", function(socket){
            console.log("Connected!");
            socket.emit("foo", "Now, we are connected");
        });
        

        index.html

        <script src="http://localhost:8001/socket.io/socket.io.js"></script>
        <script>
             var i = io.connect("http://localhost:5001");
             i.on("foo", function(bar){
                 console.log(bar);
             })
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-23
          • 2012-09-21
          • 2011-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          相关资源
          最近更新 更多