我正在使用 socket.io 包通过以下代码连接到 Node.js。
let app = express();
const http = require("http").createServer(app);
const io = require("socket.io")(http, /*options*/);
io.on('connection', function (socket) {
console.log('a user connected');
socket.conn.on('upgrade', ()=>{
const upgradedTransport = socket.conn.transport.name;
});
socket.conn.on('upgrade', ()=>{
const upgradedTransport = socket.conn.transport.name;
});
socket.on('create or join', function (room) {...});
socket.on('ready', function (room) {...});
socket.on('candidate', function (event){...});
.....
.....
socket.on('hangup', function (room) {
socket.leave(room);
socket.emit('hangup', room);
});
});
});
这是我的 Nginx 配置,
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:1337;
}
server {
server_name mydomain.subdomain.com;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
underscores_in_headers on;
location /socket.io/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:1337;
# this magic is needed for WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location / {
proxy_pass http://127.0.0.1:8094;
}
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate ...
ssl_certificate_key /etc/...;
include /etc/...;
ssl_dhparam /etc/...;
}
server {
if ($host = mydomain.subdomain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name mydomain.subdomain.com;
return 404;
}
向邮递员请求时,握手详情如下,握手详情
Request URL: https://mydomain.subdomain.com/socket.io
Request Method: GET
Status Code: 101 Switching Protocols
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 3DlYbOFVRGepjPrOd92Zew==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: mydomain.subdomain.com
还有响应头,
Server: nginx/1.14.0 (Ubuntu)
Date: Tue, 10 May 2022 12:50:41 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: FB8P5FMN8gPIsHjfRrrIoe+9+OI=
我收到此错误“错误:无效的 WebSocket 帧:RSV1 必须清除”可能是什么问题?谢谢你帮我。
Sec-WebSocket-Extensions: permessage-deflate;
我认为默认情况下,websocket 客户端会对消息使用压缩,但它接收到的数据帧不包含压缩位,因此会导致:
Invalid data frame: RSV1 must be clear
很可能是服务器中没有配置相关的压缩设置。因此,当您创建 WebSocket 服务器时,请尝试将以下选项传递给它:
let server = new Server({
perMessageDeflate: {
threshold: 2048, // defaults to 1024
zlibDeflateOptions: {
chunkSize: 8 * 1024, // defaults to 16 * 1024
},
zlibInflateOptions: {
windowBits: 14, // defaults to 15
memLevel: 7, // defaults to 8
},
clientNoContextTakeover: true, // defaults to negotiated value.
serverNoContextTakeover: true, // defaults to negotiated value.
serverMaxWindowBits: 10, // defaults to negotiated value.
concurrencyLimit: 20, // defaults to 10
},
});
您可能会看到错误随后就会消失。
无效的 WebSocket 帧:必须设置 FIN这是时间表:
* WebSocket connection established
* Preparing request to ws://localhost:3000/chat/RELIANCE
* Current time is 2024-01-14T22:16:51.680Z
* Using HTTP 1.1
> GET /chat/RELIANCE HTTP/1.1
> user-agent: insomnia/8.5.1
> authorization: Bearer sometoken
> cookie: null;
> Sec-WebSocket-Version: 13
> Sec-WebSocket-Key: GpME3yEfzG4T+mLP9mLMWw==
> Connection: Upgrade
> Upgrade: websocket
> Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
> Host: localhost:3000
< HTTP/1.1 101 Switching Protocols
< upgrade: websocket
< connection: Upgrade
< sec-websocket-accept: g5pg3cR9XPLGJYwyDYCoV64O8i4=
< sec-websocket-extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover; server_max_window_bits=10
* Invalid WebSocket frame: FIN must be set