当前位置: 首页 > 知识库问答 >
问题:

WebSocket连接失败:WebSocket握手时出错:意外响应代码:400

卢伟志
2023-03-14

我正试图将socket.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!' });
    });

    ...
}

我刚刚意识到websockets正在部分工作。我在Chrome开发者控制台看到一个101交换协议请求。但是,我看到的帧只有Engine.io协议包(ping、pong)。然而,由于某种原因,我的应用程序套接字消息仍然返回轮询...

共有1个答案

滑文昌
2023-03-14

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

看起来,即使Websocket连接正确建立(由101交换协议请求指示),它仍然默认为长轮询。修复方法非常简单,只需将此选项添加到socket.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);
});

这个Github问题为我指明了正确的方向。感谢所有帮忙的人!

 类似资料:
  • 问题内容: 我在连接到套接字服务器时遇到问题。 我有两个不同的云服务器(1)用于客户端项目,(2)用于套接字服务器。 (1)客户项目: (2)套接字服务器 1. nginx laravel-echo-server.json 下面是laravel-echo-server配置。 主管 这是主管配置。 2. Laravel回声服务器 注意:我使用和,并且效果很好。 有没有人有办法解决吗? 问题答案: 本

  • 我正在Windows Server 2008 R2上运行一个使用IIS 7.5的小网站。我有一个节点。js应用程序也在3000端口上运行。 来自网站(客户端浏览器)的Http调用从至。到目前为止一切正常。 问题是当我尝试使用套接字时。伊奥。 我正在接收: 如果我没有猜错的话,我很肯定: 它确实会将初始请求转发到我的服务器,因为对websocket服务器的初始请求是一个标准HTTP请求(带有一些附加

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t

  • 我正在使用C Builder 10.1柏林编写一个简单的WebSocket服务器应用程序,它在端口上侦听从网络浏览器发送的一些命令,如谷歌Chrome。 在我的表单上,我有一个TMemo、TButton和TIdHTTPServer,我有以下代码: 从Chrome,我执行这个Javascript代码: 但是我从Chrome上得到了这个错误: VM77:1到“ws://localhost:55555/

  • 我正在使用Python的套接字来响应Websocket请求,并且我面临着头的问题。以前可能有过类似的问题,但没有人为我工作 文档位于https://developer.mozilla.org声明对于要建立的连接: 服务器获取握手请求中发送的Sec-WebSocket-Key的值,追加258EAFA5-E914-47DA-95CA-C5AB0DC85B11,获取新值的SHA-1,然后对其进行Bas6

  • 我正在使用套接字。io,应用程序由AWS提供。我收到一个浏览器控制台错误: websocket.js:54 WebSocket 连接到 'wss://www.tidee.com/socket.io/?EIO=4 客户代码: 服务器代码: 在 AWS 中,安全组接受端口 443,负载均衡器侦听端口 443。 应用程序在本地运行时工作(状态 101),并使用 协议。