Ara*_*ash 11 unity-game-engine websocket node.js websocket-sharp uwebsockets
我们有一个使用 websocket 进行连接的手机游戏。服务器是使用uWebSockets.js库的 Node.js 应用程序,客户端是使用Websocket-Sharp库的 Unity 应用程序。他们俩一起打得很好,我们没有遇到任何问题。
最近我们想启用websocket 压缩。两个库都表示它们支持按消息压缩扩展,但似乎有一些与它们不兼容的东西。因为当我们配置为使用压缩时,websocket 连接会在握手时立即关闭。
我们还使用ws库测试了客户端,并提供了具有相同结果的压缩示例。我们尝试修改 ws 压缩选项,发现当我们评论 serverMaxWindowBits 选项(默认为协商值)时,可以建立连接并且发送和接收消息没有问题。我们还询问了如何控制 uWebsockets 中的 serverMaxWindowBits。
我们尝试的最后一件事是连接一个最小的 uWS 服务器和 websocket-sharp 客户端。这是服务器的代码:
const uWS = require('uWebSockets.js');
const port = 5001;
const app = uWS.App({
}).ws('/*', {
/* Options */
compression: 1, // Setting shared compression method
maxPayloadLength: 4 * 1024,
idleTimeout: 1000,
/* Handlers */
open: (ws, req) => {
console.log('A WebSocket connected via URL: ' + req.getUrl() + '!');
},
message: (ws, message, isBinary) => {
/* echo every message received */
let ok = ws.send(message, isBinary);
},
drain: (ws) => {
console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
},
close: (ws, code, message) => {
console.log('WebSocket closed');
}
}).any('/*', (res, req) => {
res.end('Nothing to see here!');
}).listen(port, (token) => {
if (token) {
console.log('Listening to port ' + port);
} else {
console.log('Failed to listen to port ' + port);
}
});
Run Code Online (Sandbox Code Playgroud)
这是客户端代码:
using System;
using WebSocketSharp;
namespace Example
{
public class Program
{
public static void Main (string[] args)
{
using (var ws = new WebSocket ("ws://localhost:5001")) {
ws.OnMessage += (sender, e) =>
Console.WriteLine ("server says: " + e.Data);
ws.Compression = CompressionMethod.Deflate; // Turning on compression
ws.Connect ();
ws.Send ("{\"comm\":\"example\"}");
Console.ReadKey (true);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我们运行服务器和客户端时,客户端发出以下错误:
错误|WebSocket.checkHandshakeResponse|服务器没有发回'server_no_context_takeover'。致命|WebSocket.doHandshake|包含无效的 Sec-WebSocket-Extensions 标头。
客户端似乎期望 server_no_context_takeover 标头并且没有收到。我们查看了uWebsockets源代码(uWebsockets.js 模块的 C++ 部分)并发现了一个用于发送回 server_no_context_takeover 标头的注释条件。于是我们取消了条件的注释,构建了uWebsockets.js,再次测试,在客户端遇到如下错误:
WebSocketSharp.WebSocketException:无法从流中读取帧的标头。
有什么建议可以让这两个库协同工作吗?
更新:根据我对 中代码的阅读uWebSockets.js,需要进行更改以启用所有websocket-sharp需要设置的参数来启用压缩。在高性能 Java 服务器 Vertx 中,以下设置可与 Unity 兼容进行websocket-sharp压缩:
vertx.createHttpServer(new HttpServerOptions()
.setMaxWebsocketFrameSize(65536)
.setWebsocketAllowServerNoContext(true)
.setWebsocketPreferredClientNoContext(true)
.setMaxWebsocketMessageSize(100 * 65536)
.setPerFrameWebsocketCompressionSupported(true)
.setPerMessageWebsocketCompressionSupported(true)
.setCompressionSupported(true));
Run Code Online (Sandbox Code Playgroud)
之前:
错误确实存在,websocket-sharp仅支持permessage-deflate,请使用DEDICATED_COMPRESSOR( compression: 2) 代替。
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |