Bağlantılar için websocket kullanan bir mobil oyunumuz var. Sunucu uWebSockets.js kitaplığını kullanan bir Node.js uygulaması ve istemci Websocket-Sharp kitaplığını kullanan bir Unity uygulamasıdır . İkisi birlikte iyi oynuyor ve onlarla bir sorunla karşılaşmadık.
Son zamanlarda websocket sıkıştırmasını etkinleştirmek istedik . Her iki kütüphane de İleti Başına Sıkıştırma uzantısını desteklediklerini, ancak onlarla uyumsuz bir şey olduğu anlaşılıyor. Çünkü sıkıştırma kullanacak şekilde yapılandırdığımızda websocket bağlantısı el sıkışmasında hemen kapanır.
Ayrıca istemciyi ws kütüphanesi ile test ettik ve aynı sonuçla sıkıştırma için örnek sağlandı. Ws sıkıştırma seçenekleriyle uğraşmayı denedik ve serverMaxWindowBits seçeneğini (varsayılan olarak anlaşılan değer) yorum yaptığımızda bağlantının kurulabileceğini ve mesaj alıp göndermenin sorunsuz çalıştığını gördük. Ayrıca uWebsockets içindeki serverMaxWindowBits öğelerini denetleme hakkında da sorduk .
Denediğimiz son şey, minimal bir uWS sunucusu ve websocket-sharp istemcisi bağlamaktı. Sunucunun kodu şöyledir:
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);
}
});
İstemci kodu şöyledir:
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);
}
}
}
}
Sunucuyu ve istemciyi çalıştırdığımızda, istemci aşağıdaki hatayı yayar:
Hata | WebSocket.checkHandshakeResponse | Sunucu 'server_no_context_takeover' öğesini geri göndermedi. Fatal | WebSocket.doHandshake | Geçersiz bir Sec-WebSocket-Extensions üstbilgisi içerir.
İstemcinin server_no_context_takeover üstbilgisini beklediği ve bir tane almadığı anlaşılıyor. Biz gözden uWebsockets kaynağını (uWebsockets.js modülünün C ++ parçası) ve bir tespit yorumladı koşulu geri server_no_context_takeover başlığını göndermek için. Bu nedenle durumu çözdük ve uWebsockets.js'yi oluşturduk ve istemcide aşağıdaki hatayla karşılaşmak için tekrar test ettik:
WebSocketSharp.WebSocketException: Bir çerçevenin başlığı akıştan okunamıyor.
Bu iki kütüphanenin birlikte çalışması için herhangi bir öneriniz var mı?