我正在try 集成套接字.io和Angular,我很难从客户端连接到服务器.我已经浏览过其他相关的问题,但是我的问题在本地发生,所以中间没有Web服务器.

这就是我的服务器代码:

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库之前,我想确保能够正确连接,但控制台中出现以下错误:

socket io connection error message

有趣的是,如果我重新启动 node .在js服务器进程中,它确实能够发送消息,但使用轮询而不是WebSocket.

after restart

polling message

我在插座上try 了各种不同的 Select .接通电话,但什么都没用.

任何帮助都将不胜感激.


更新(30/12/2016):

我刚刚意识到websockets部分起作用了.我在Chrome开发者控制台中看到101交换协议请求.然而,我看到的唯一画面是引擎.io协议包(乒乓、乒乓).然而,由于某些原因,我的应用程序套接字消息仍然返回到轮询...

engine.io packets

推荐答案

问题解决了!我刚刚想出了如何解决这个问题,但我仍然想知道这是否是正常行为.

看起来,即使Websocket连接建立正确(由101交换协议请求指示),它仍然默认为长轮询.修复方法很简单,只需将此选项添加到套接字.io连接功能:

{transports: ['websocket']}

所以代码最终看起来是这样的:

const app = express();
const server = http.createServer(app);
var io = require('socket.io')(server);

io.on('connection', function(socket) {
  console.log('connected socket!');

  socket.on('greet', function(data) {
    console.log(data);
    socket.emit('respond', { hello: 'Hey, Mr.Client!' });
  });
  socket.on('disconnect', function() {
    console.log('Socket disconnected');
  });
});

关于客户:

var socket = io('ws://localhost:3000', {transports: ['websocket']});
socket.on('connect', function () {
  console.log('connected!');
  socket.emit('greet', { message: 'Hello Mr.Server!' });
});

socket.on('respond', function (data) {
  console.log(data);
});

这些信息现在显示为框架:

working websockets

Github issue个给我指明了正确的方向.感谢所有帮忙的人!

Node.js相关问答推荐

RSA-SHA 256签名算法未按预期表现

使用Node.js中的";类型";:";模块";不导入文件

对于具有重叠列的组合键,在冲突&q;上没有唯一或排除约束匹配错误

如何发送比特币BTC使用发送加密使用WIF密钥在 node ,js

在mongoose虚拟属性中处理异步操作

Amplify 部署的应用程序出现TypeError: handler is not a function错误,但它在本地运行

Docker node_modules 文件夹上的 React 应用程序不可用

为什么运行 yarn 命令会出错 - yargs-parser的完整性判断失败

在路由上使用中间件时,Nodejs Express 应用程序失败

使用正则表达式查找文档,但输入是数组

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

如何刷新 youtube-data-api v3 的访问令牌

Firestore promise 在退货前等待产品详细信息

如何在 cypress 测试中进行计算

如何promise AWS JavaScript 开发工具包?

Nodejs 随机免费 tcp 端口

如何在 NodeJs 中下载和解压缩内存中的 zip 文件?

如何在离线时安装 npm 包?

如何忽略文件 grunt uglify

在 Node.js 中写入 CSV