为了账号安全,请及时绑定邮箱和手机立即绑定

Websocket连接错误:返回101,但不升级

Websocket连接错误:返回101,但不升级

幕布斯7119047 2022-10-13 16:02:20
我正在使用 ws 库设置一些 websocket。我正在努力使用握手设置授权。我已经向我们的服务器添加了一条路由来升级到 websocket 连接,如下所示:    .get(      '/chat',    authorisationFunction,    upgradeConnection,    ),websocket服务器:const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 3030 }); 这是 upgradeConnection 函数,如果授权成功,它将运行:const upgradeConnection = (request, socket, head) => {  return wss.handleUpgrade(request, request.socket, head, function done(ws) {    return wss.emit('connection', ws, request);  });}我还有一个收听消息的功能:function webSocketsServer() {  wss.on('connection', (ws, request, client) => {    ws.on('message', message => {      ws.send(message);    });  });}发出一个连接,并从我的服务器得到以下响应:HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: QyVvqadEcI1+ALka6j2pLKBkfNQ=但随后在我的客户端上立即出现错误“与 'ws://localhost:3000/chat' 的 WebSocket 连接失败:帧头无效”。但是当我绕过握手并直接连接到我的 websocket 服务器时,我可以成功发送消息。该错误仅在客户端上,不在后端。我错过了什么?
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我不是 100% 确定这是唯一的方法,但可能会有所帮助,所以我将其发布。基于这个答案,我会选择使用相同端口进行 http 和 websocket 连接的服务器。你可以像这样实现它:


const { createServer } = require('http')

const ws = require('ws')

const express = require('express')


const app = express()


const server = createServer(app)


app.get('/', (req, res) => {

  res.send('I am a normal http server response')

})


const wsServer = new ws.Server({

  server,

  path: '/websocket-path',

})


wsServer.on('connection', (connection) => {

  connection.send('I am a websocket response')

})


server.listen(3030, () => {

  console.log(`Server is now running on http://localhost:3030`)

  console.log(`Websocket is now running on ws://localhost:3030/<websocket-path>`)

})

因此,您的服务器在端口 3030 上侦听正常的 http 请求。如果它在路径 '/websocket-path' 上收到一个 websocket 连接请求,它会被传递给 ws 连接处理程序,然后你就可以开始了。


查看完整回答
反对 回复 2022-10-13
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信