[英]socket.io - 'connect' event does not fire on the client
我正在尝试开始使用 node.js 和 socket.io。
我有一个非常(非常)简单的客户端-服务器测试应用程序,但我无法让它工作。
系统搭建在windows机器上,服务器为apache。
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
启动我的服务器后,标准(预期)output 被写入服务器控制台:
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
和max reconnection attempts
并放弃返回connect_failed
.
对此的任何帮助\见解都会有所帮助。
谢谢
确保客户端和服务器具有相同的主要版本 socket.io。例如,服务器上的socket.io-client@3.xx
和客户端上的socket.io@2.3.0
的组合导致这种情况和“连接”事件没有派出。
//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 下使用。
前端(客户端)的变化:
var socket = io.connect(http://myapp.herokuapp.com);
到
var socket = io.connect();
在与未正确注册到服务器的连接的各种客户端(Chrome、Firefox 浏览器和 Phonegap 应用程序)打交道数小时后(即服务器在其日志中成功注册了 websocket 连接,但前端未注册连接事件),我从评论中尝试了@Timothy 的解决方案,现在一切都在 heroku 和本地主机上再次运行。
使用 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>
在创建时使用autoConnect: false
选项: io(... { autoConnect: false })
,订阅您的事件并调用io.connect()
。
尝试以下操作:
改变
var socket = io.connect('http://localhost', { port: 8001 });
到
var socket = io.connect('http://localhost:8001');
// server
var server = http.createServer(app).listen(8001);
// client
var socket = io.connect();
尝试使用这个:
服务器.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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.