我最近将一个使用socket.io与客户端应用通信的node.js服务器应用程序部署到Google App Engine。根据这篇文章,App Engine现在支持WebSockets。
然而,客户端应用无法通过wss协议连接到服务器。我可以在浏览器控制台中看到以下错误消息。(我删除了我的服务器域名)
WebSocket连接到'wss://[my server]/socket.io/?EIO=3&transport=websocket&sid=dbB2UgsCYhD7c1ucAAAA'失败:WebSocket握手期间出错:意外的响应代码:400
于是Socket.io退回到https长轮询,这很好用。
这是我用于部署到App Engine的app.yaml文件,其中session_affinity设置为true以进行长轮询。
runtime: nodejs10
instance_class: F2
handlers:
- url: /.*
secure: always
redirect_http_response_code: 301
script: auto
network:
session_affinity: true
Socket.io在服务器上以简单直接的方式使用:
this.server = this.app.listen(this.PORT, (err: any) => {
io = socketio().listen(this.server);
io.on("connection", (socket) => {
console.log('A socket connection was made!');
});
});
我想知道如何在App Engine上使WebSocket连接工作?也许需要防火墙规则或其他配置更改吗?
handlers
只能在 App Engine Standard 中使用。但你可以通过编写代码来创建路由处理程序。就个人而言,我以前使用过 express-ws,如果你有编写express.js
应用程序的经验,它可以让你编写类似于任何其他路由处理程序的 WebSockets 终端点。 - JKleinne