首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用websocket压缩与uWebSockets.js和Websocket-Sharp

使用websocket压缩与uWebSockets.js和Websocket-Sharp
EN

Stack Overflow用户
提问于 2019-12-04 16:10:19
回答 1查看 3.2K关注 0票数 11

我们有一个移动游戏使用websocket进行连接。服务器是使用Node.js库的uWebSockets.js应用程序,客户机是使用Websocket-Sharp库的统一应用程序。他们都踢得很好,我们没有遇到他们的问题。

最近,我们希望启用websocket压缩。这两个库都表示支持每条消息压缩扩展,但似乎与它们不兼容。因为当我们配置为使用压缩时,websocket连接会在握手时立即关闭。

我们还用ws库测试了客户端,并提供了具有相同结果的压缩示例。我们尝试修改ws压缩选项,发现当我们评论serverMaxWindowBits选项(默认为协商值)时,可以建立连接,并且发送和接收消息没有问题。我们还对已询问中的serverMaxWindowBits进行了uWebsockets控制。

我们最后一次尝试的是连接一个最小的uWS服务器和websocket客户端。以下是服务器的代码:

代码语言:javascript
复制
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);
        }
    });

以下是客户端代码:

代码语言:javascript
复制
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);
      }
    }
  }
}

当我们运行服务器和客户端时,客户端会发出以下错误:

Error|WebSocket.checkHandshakeResponse|The服务器尚未发回‘server _no_takeover’。Fatal|WebSocket.doHandshake|Includes无效的Sec-WebSocket-扩展头.

客户端似乎期望server_no_context_takeover头,但没有收到一个。我们回顾了uWebsockets源代码(C++是uWebsockets.js模块的一部分),并找到了一个用于发送server_no_context_takeover头的评论条件。因此,我们取消了对条件的注释,构建了uWebsockets.js,并再次进行了测试,以在客户机中遇到以下错误:

WebSocketSharp.WebSocketException:无法从流中读取帧的标题。

有什么建议可以让这两个图书馆一起工作吗?

EN

回答 1

Stack Overflow用户

发布于 2019-12-04 18:17:33

更新:基于我在uWebSockets.js中读取的代码,需要进行更改以启用websocket-sharp需要设置的所有参数以启用压缩。在高性能的Java服务器Vertx中,以下设置与与统一兼容的websocket-sharp一起工作以进行压缩:

代码语言:javascript
复制
vertx.createHttpServer(new HttpServerOptions()
                .setMaxWebsocketFrameSize(65536)
                .setWebsocketAllowServerNoContext(true)
                .setWebsocketPreferredClientNoContext(true)
                .setMaxWebsocketMessageSize(100 * 65536)
                .setPerFrameWebsocketCompressionSupported(true)
                .setPerMessageWebsocketCompressionSupported(true)
                .setCompressionSupported(true));

以前的:

错误是真实的,websocket-sharp只支持permessage-deflate,使用DEDICATED_COMPRESSOR (compression: 2)代替。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59180250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档