接続に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);
}
});
これがクライアントコードです:
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);
}
}
}
}
サーバーとクライアントを実行すると、クライアントは次のエラーを出力します。
エラー| WebSocket.checkHandshakeResponse |サーバーは 'server_no_context_takeover'を送り返していません。Fatal | WebSocket.doHandshake |無効なSec-WebSocket-Extensionsヘッダーが含まれています。
クライアントはserver_no_context_takeoverヘッダーを予期しているようで、受信しませんでした。我々は、レビューuWebsocketsのソース(uWebsockets.jsモジュールのC ++一部)、見つかったコメント条件バックserver_no_context_takeoverヘッダを送信するために。したがって、条件のコメントを外してuWebsockets.jsをビルドし、再度テストして、クライアントで次のエラーが発生するようにしました。
WebSocketSharp.WebSocketException:フレームのヘッダーをストリームから読み取ることができません。
これら2つのライブラリを連携させるための提案はありますか?