繁体   English   中英

Socket.io无法连接,转向“轮询”

[英]Socket.io cannot connect, resorts to “polling”

我正在尝试创建一个websocket客户端 - 服务器应用程序,其中客户端和服务器将在两个不同的实例上运行。

设定

  • 服务器/后端:在localhost:9006上运行,包含angular-fullstack生成器,包括socket.io
  • 客户端/前端:在localhost:9007上运行,带有角度生成器 + socket.io-client + btford.socket-io(一个AngularJS socket.io桥)

客户端和服务器

服务器

注意:不完整的代码,但我认为相关的部分。

// ----- socketio.js -----

// When the user connects.. perform this
function onConnect(socket) {
    // When the client emits 'info', this listens and executes
    socket.on('info', function (data) {
        console.info('[%s] %s', socket.address, JSON.stringify(data, null, 2));
        socket.emit('pong', 'OK!');
    });
    // Insert sockets below
    require('../api/thing/thing.socket').register(socket);
}

socketio.set('origins', 'http://localhost:9007');

// ----- express.js -----

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9007');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

// ----- app.js -----

// Start server
server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

客户

// ----- client app.js

angular
.module('weldCommentsClientApp', [
    'ngAnimate', 'ngAria', 'ngCookies', 'ngMessages', 'ngResource', 'ngRoute', 'ngSanitize', 'ngTouch',
    'btford.socket-io'
])
.factory('mySocket', function (socketFactory) {
    var myIoSocket = window.io.connect('http://localhost:9006');
    var mySocket = socketFactory({
        ioSocket: myIoSocket
    });
    mySocket.forward('pong');
    console.log('mySocket', mySocket);
    return mySocket;
})

// ----- client main.js

angular.module('weldCommentsClientApp').controller('MainCtrl', function ($scope, mySocket) {
    $scope.$on('socket:pong', function (ev, data) {
        console.log('socket:pong', ev, data);
    });
    mySocket.emit('info');
});

结果

服务器或客户端上没有控制台错误,但它不起作用,服务器记录以下100行:

GET /socket.io/?EIO=3&transport=polling&t=1421488528935-16027 200 2ms

...看起来客户端通过HTTP连接但无法切换到websockets。

有任何想法吗?

更新

这是整个客户端/服务器项目,其中包含README中的说明: https//github.com/weld-io/socket.io-client-server-boilerplate

在server / app.js中未正确定义路径

尝试使用'/socket.io'这样的路径:

var socketio = require('socket.io')(server, {
  serveClient: (config.env === 'production') ? false : true,
  path: '/socket.io'
});

接下来,要选择websockets而不是long-polling,可以在test-client / scripts / application.js中选择websocket传输。

var myIoSocket = window.io.connect('http://localhost:9006', {transports:['websocket']});

我建议你分别测试客户端服务器。 对于这种情况,nc将是理想的替代方案。

  1. 启动服务器和echo testserver | nc server_ip server_port echo testserver | nc server_ip server_port并检查服务器日志。

  2. 启动客户端和netcat -l -p server_port并检查客户端日志。

顺便说一句,您显示的客户端代码似乎并未尝试连接到服务器。

我认为这是因为您的服务器在http:// localhost:9007上使用套接字,而在http:// localhost:9006上使用客户端。 尝试将两者放在同一个端口上,它应该可以工作。

可以尝试两件事:先改变

window.io.connect('http://... 

window.io.connect('ws://...

其次在服务器端设置

socketio.set('transports',['xhr-polling']);

我知道这看起来不正确,因为你想避免轮询,它仍然帮助了许多有同样问题的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM