Socket.io无法连接,请求“投票”

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

build立

  • 服务器/后端:在localhost:9006使用包括socket.io的angular-fullstack生成器运行
  • 客户端/前端localhost:9007使用angular度生成器 + socket.io-client + btford.socket-io(AngularJS socket.io桥接器)在localhost:9007上运行

客户端和服务器

服务器

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

 // ----- 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'); }); 

结果

服务器和客户端上没有控制台错误,但它不起作用,服务器logging这些行的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中没有正确定义path

尝试使用如下所示的“/socket.io”path:

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

接下来,要selectwebsockets而不是long-polling,可以在test-client / scripts / application.js中selectwebsocket传输

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

我build议你分别testing客户端服务器。 NC将是这种情况的理想select。

  1. 启动服务器和echo testserver | nc server_ip server_port服务器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']); 

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