Socket.IO不适用于Windows和Chrome浏览器 [英] Socket.IO not working in Chrome and Firefox on Windows

查看:247
本文介绍了Socket.IO不适用于Windows和Chrome浏览器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用node.js(0.10.10),socket.io(0.9.16)和Express(3.2.6)创建了一个类似于聊天服务器和客户端的Facebook。它适用于所有浏览器,包括所有版本的Internet Explorer,但Windows上的Firefox(21.0)和Chrome(27.0.1453.116)无法正常工作。它可以在OS X上的所有浏览器中工作。



当我尝试通过查看错误事件的返回数据来调试错误时,数据总是未定义的。我已经尝试了所有可能的传输方式。

这是我用于在Windows和Chrome浏览器上测试的聊天应用程序的简化代码:



客户:

 < script src =http:// www.xserverx.com:8080/socket.io/socket.io.js\"></script> 
< script>
var ioUrl ='http://www.xserverx.eu:8080';
var socket = io.connect(ioUrl,{
'reconnect':true,
'重新连接延迟':1500,
//'unload卸载时同步断开连接':true
}); ()函数(){
socket.emit('message',{message:$('#message')。val() });
});
$ b //事件监听器
socket.on('connect',function(){
//显示套接字传输类型
//在Chrome和Firefox中为空在Windows
$('#transport-type')。html(socket.socket.transport.name);
});
$ b socket.on('onlinechange',function(data){
$('#users-online')。html(data.online);
});

socket.on('message',function(data){
$('#chat')。append('< p> + data.message +'< p>');
});

socket.on('error',function(data){
$('#errors')。html('Error:Error。'+ JSON.stringify(data));
});
socket.on('connect_failed',function(data){
$('#errors')。html('Error:Connect failed。'+ JSON.stringify(data));
});
socket.on('reconnect_failed',function(data){
$('#errors')。html('Error:Reconnect failed。'+ JSON.stringify(data));
});
< / script>

服务器:

  var express = require('express'),
app = express(),
sio = require('socket.io');

var port = 8080;

var io = sio.listen(app.listen(port));
io.set('log level',1); //只显示警告和错误
io.set('polling duration',10);
io.enable('浏览器客户端缩小');
io.enable('browser client gzip');


var totalOnline = 0;

$ Server
io.sockets.on('connection',function(socket){
socket.setMaxListeners(0);

console .log('----新用户在线----');
totalOnline ++;
socket.emit('onlinechange',{online:totalOnline});

socket.on('disconnect',function(){
console.log('---- User disconnected ----');

totalOnline--;

socket.eon('onlinechange',{online:totalOnline});
});

socket.on('message',function(data){
io.sockets.emit('message',{message:data.message});
});
});
console.log('Listening on port'+ port);

这是在Windows中将单个用户与Chrome连接时来自服务器的调试日志:

 监听端口8080 
调试 - 提供静态内容/socket.io.js
调试 - 客户端授权
info - 握手授权NnDQmjFbOsc37kSRdPCg
调试 - 设置请求GET /socket.io/1/websocket/NnDQmjFbOsc37kSRdPCg
debug - 为客户端设置心跳间隔NnDQmjFbOsc37kSRdPCg
调试 - 为$ b $授权的客户端b debug - websocket写作1 ::
----新用户在线----
debug - websocket写作5 ::: {name:onlinechange,args:[{ online:1}]}
调试 - 设置请求GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799
调试 - 设置轮询超时
调试 - 丢弃传输
debug - 清除客户端的心跳间隔NnDQmjFbOsc37kSRdPCg
调试 - 清除轮询超时
debug - xhr-polling写入8 ::
debu g - 为客户端设置关闭超时NnDQmjFbOsc37kSRdPCg
debug - 由于超过持续时间而关闭xhr-polling
调试 - 设置请求GET /socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i= 0
调试 - 设置轮询超时
调试 - 丢弃传输
调试 - 为客户端清除关闭超时NnDQmjFbOsc37kSRdPCg
调试 - 设置请求GET /socket.io/1/xhr-polling/ NnDQmjFbOsc37kSRdPCg?t = 1372166551918
调试 - 设置轮询超时
调试 - 丢弃传输
调试 - 清除轮询超时
调试 - 清除轮询超时
调试 - xhr-polling写入8 ::
debug - 为客户端设置关闭超时NnDQmjFbOsc37kSRdPCg
debug - 由于超过持续时间而关闭xhr-polling
调试 - 设置请求GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg ?t = 1372166562023
调试 - 设置轮询超时
调试 - 丢弃传输
调试 - 为客户端清除关闭超时NnDQmjFbOsc37kSRdPCg

这是最初的 /socket.io/1 / b
$ b

  polling,jsonp-polling 

这是一个Chrome请求日志:

  XHR完成加载:http://www.xserverx.com:8080/socket.io/1/?t=1372166531543。 socket.io.js:2 
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551918。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166562023。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166572144。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166582249。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166592351。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166602445。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166612595。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166622697。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166632801。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166642900。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166653115。 socket.io.js:2
GET http://www.xserverx.com:8080/socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i=0 socket.io.js:2 (失败)
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166663203。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166673295。 socket.io.js:2
XHR完成加载:http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166683405。 socket.io.js:2


解决方案

代码解决你的问题
$ b $ pre $ code io.configure(function(){
io.set(transports,[ xhr-polling]);
io.set(polling duration,10);
});


I have made a Facebook like chat server and client using node.js (0.10.10), socket.io (0.9.16) and Express (3.2.6). It works perfectly fine in all browsers including all versions of Internet Explorer, but Firefox (21.0) and Chrome (27.0.1453.116) on Windows just won't work. It does work in said browsers on OS X.

When I try to debug the errors by viewing the returned data of the error events, the data is always undefined. I have tried all possible transports.

This is the simplified code of the chat application I used for testing on Chrome and Firefox in Windows:

Client:

<script src="http://www.xserverx.com:8080/socket.io/socket.io.js"></script>
<script>
    var ioUrl = 'http://www.xserverx.eu:8080';
    var socket = io.connect(ioUrl, {
        'reconnect': true,
        'reconnection delay': 1500,
        //'sync disconnect on unload': true
    });

    $('#send-button').click(function() {
        socket.emit('message', { message: $('#message').val() });
    });

    // Event listeners
    socket.on('connect', function() {
        // Display socket transport type
        // Is empty in Chrome and Firefox on Windows
        $('#transport-type').html(socket.socket.transport.name);
    });

    socket.on('onlinechange', function(data) {
        $('#users-online').html(data.online);
    });

    socket.on('message', function(data) {
        $('#chat').append('<p>' + data.message + '</p>');
    });

    socket.on('error', function(data) {
        $('#errors').html('Error: Error. ' + JSON.stringify(data));
    });
    socket.on('connect_failed', function(data) {
        $('#errors').html('Error: Connect failed. ' + JSON.stringify(data));
    });
    socket.on('reconnect_failed', function(data) {
        $('#errors').html('Error: Reconnect failed. ' + JSON.stringify(data));
    });
</script>

Server:

var express = require('express'),
    app = express(),
    sio = require('socket.io');

var port = 8080;

var io = sio.listen(app.listen(port));
    io.set('log level', 1); // Only show warnings and errors
    io.set('polling duration', 10);
    io.enable('browser client minification');
    io.enable('browser client gzip');


var totalOnline = 0;

// Server
io.sockets.on('connection', function(socket) {
    socket.setMaxListeners(0);

    console.log('---- New user online ----');
    totalOnline++;
    socket.emit('onlinechange', { online: totalOnline });

    socket.on('disconnect', function() {
        console.log('---- User disconnected ----');

        totalOnline--;

        socket.emit('onlinechange', { online: totalOnline });
    });

    socket.on('message', function(data) {
        io.sockets.emit('message', { message: data.message });
    });
});
console.log('Listening on port ' + port);

This is the debug log from the server when connecting a single user with Chrome in Windows:

Listening on port 8080
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized NnDQmjFbOsc37kSRdPCg
   debug - setting request GET /socket.io/1/websocket/NnDQmjFbOsc37kSRdPCg
   debug - set heartbeat interval for client NnDQmjFbOsc37kSRdPCg
   debug - client authorized for 
   debug - websocket writing 1::
---- New user online ----
   debug - websocket writing 5:::{"name":"onlinechange","args":[{"online":1}]}
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared heartbeat interval for client NnDQmjFbOsc37kSRdPCg
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - xhr-polling closed due to exceeded duration
   debug - setting request GET /socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i=0
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551918
   debug - setting poll timeout
   debug - discarding transport
   debug - clearing poll timeout
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - xhr-polling closed due to exceeded duration
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166562023
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client NnDQmjFbOsc37kSRdPCg

And this is the response from the initial /socket.io/1/?t=1372166652973 file:

NnDQmjFbOsc37kSRdPCg:60:60:websocket,htmlfile,xhr-polling,jsonp-polling

And this is a piece of the Chrome requests log:

XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/?t=1372166531543". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551918". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166562023". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166572144". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166582249". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166592351". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166602445". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166612595". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166622697". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166632801". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166642900". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166653115". socket.io.js:2
GET http://www.xserverx.com:8080/socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i=0  socket.io.js:2 (FAILED)
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166663203". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166673295". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166683405". socket.io.js:2

解决方案

You can use following code for solve your problem

io.configure(function () { 
   io.set("transports", ["xhr-polling"]); 
   io.set("polling duration", 10); 
});

这篇关于Socket.IO不适用于Windows和Chrome浏览器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆