我正在尝试将 Socket.io 与 Angular 集成,但在从客户端到服务器建立连接时遇到困难。我查看了其他相关问题,但我的问题发生在本地,所以中间没有网络服务器。
这就是我的服务器代码的样子:
const app = express();
const server = http.createServer(app);
const io = require('socket.io').listen(server);
io.on('connection', function(socket) {
socket.emit('greet', { hello: 'Hey, Mr.Client!' });
socket.on('respond', function(data) {
console.log(data);
});
socket.on('disconnect', function() {
console.log('Socket disconnected');
});
});
我使用 Grunt 按以下顺序加载客户端 JavaScript 文件:
dist: {
src: [
public/bower_components/angular/angular.min.js,
...
public/bower_components/socket.io-client/dist/socket.io.min.js,
public/bower_components/angular-socket-io/socket.min.js,
...
]
}
然后在我的控制器中:
function MyController($scope) {
let socket = io.connect(window.location.href);
socket.connect('http://localhost:3000');
socket.on('greet', function(data) {
console.log(data);
socket.emit('respond', { message: 'Hello to you too, Mr.Server!' });
});
...
}
在实际使用之前btford/angular-socket-io
库,我想确保我可以正确获得连接,但我在控制台中收到以下错误:
有趣的是,如果我重新启动 Node.js 服务器进程,它确实会设法发送消息,但使用轮询而不是 Websocket。
我在 socket.connect 调用中尝试了各种不同的选项,但没有任何效果。
任何帮助,将不胜感激。
更新(2016 年 12 月 30 日):
我刚刚意识到 websockets 正在部分工作。我在 Chrome 开发者控制台中看到 101 Switching Protocols 请求。然而,我看到的唯一帧是engine.io 协议数据包(ping、pong)。然而,由于某种原因,我的应用程序套接字消息仍然回退到轮询......