Socket.io 无法连接,求助于 "polling"
Socket.io cannot connect, resorts to "polling"
我正在尝试创建一个 websocket client-server 应用程序,其中客户端和服务器将 运行 在两个不同的实例上。
设置
- Server/Back-end:运行在
localhost:9006
上与 angular-fullstack generator 包括 socket.io
- Client/Front-end:运行在
localhost:9007
上使用 angular generator + 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。
有什么想法吗?
更新
这是整个 client/server 项目,在自述文件中有说明:https://github.com/weld-io/socket.io-client-server-boilerplate
我建议你分别测试client-server。 nc 将是这种情况的理想选择。
启动服务器并echo testserver | nc server_ip server_port
并检查服务器日志。
启动客户端并netcat -l -p server_port
并检查客户端日志。
顺便说一句,您显示的客户端代码似乎并未尝试连接到服务器。
我认为这是因为您的服务器正在 http://localhost:9007 and your client on http://localhost:9006 上使用套接字。尝试将两者放在同一个端口上,它应该可以工作。
可以尝试两件事:
第一个变化
window.io.connect('http://...
到
window.io.connect('ws://...
其次在服务器端设置
socketio.set('transports',['xhr-polling']);
我知道这看起来不正确,因为你想避免轮询,但它仍然帮助了很多遇到同样问题的人。
server/app.js 中的路径定义不正确
尝试像这样使用“/socket.io”路径:
var socketio = require('socket.io')(server, {
serveClient: (config.env === 'production') ? false : true,
path: '/socket.io'
});
接下来,要选择 websockets 而不是长轮询,您可以 select test-client/scripts/application.js
中的 websocket 传输
var myIoSocket = window.io.connect('http://localhost:9006', {transports:['websocket']});
我正在尝试创建一个 websocket client-server 应用程序,其中客户端和服务器将 运行 在两个不同的实例上。
设置
- Server/Back-end:运行在
localhost:9006
上与 angular-fullstack generator 包括 socket.io - Client/Front-end:运行在
localhost:9007
上使用 angular generator +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。
有什么想法吗?
更新
这是整个 client/server 项目,在自述文件中有说明:https://github.com/weld-io/socket.io-client-server-boilerplate
我建议你分别测试client-server。 nc 将是这种情况的理想选择。
启动服务器并
echo testserver | nc server_ip server_port
并检查服务器日志。启动客户端并
netcat -l -p server_port
并检查客户端日志。
顺便说一句,您显示的客户端代码似乎并未尝试连接到服务器。
我认为这是因为您的服务器正在 http://localhost:9007 and your client on http://localhost:9006 上使用套接字。尝试将两者放在同一个端口上,它应该可以工作。
可以尝试两件事: 第一个变化
window.io.connect('http://...
到
window.io.connect('ws://...
其次在服务器端设置
socketio.set('transports',['xhr-polling']);
我知道这看起来不正确,因为你想避免轮询,但它仍然帮助了很多遇到同样问题的人。
server/app.js 中的路径定义不正确
尝试像这样使用“/socket.io”路径:
var socketio = require('socket.io')(server, {
serveClient: (config.env === 'production') ? false : true,
path: '/socket.io'
});
接下来,要选择 websockets 而不是长轮询,您可以 select test-client/scripts/application.js
中的 websocket 传输var myIoSocket = window.io.connect('http://localhost:9006', {transports:['websocket']});