39

我正在尝试开始使用 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 timeoutmax reconnection attempts放弃返回connect_failed

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

谢谢

4

7 回答 7

13

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

于 2021-01-03T21:35:12.670 回答
10
//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下使用。

于 2014-09-15T17:13:48.537 回答
4

前端(客户端)的变化:

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

var socket = io.connect();

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

于 2014-04-10T23:33:51.107 回答
2

使用 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>
于 2020-05-02T14:01:13.560 回答
0

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

于 2021-05-20T09:28:46.097 回答
-1

尝试使用这个:

服务器.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");
});

索引.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>
于 2014-10-16T23:39:53.843 回答
-1

尝试以下操作:

改变

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

var socket = io.connect('http://localhost:8001');
于 2012-04-20T20:12:45.193 回答