Chúng tôi có một trò chơi di động sử dụng websocket cho các kết nối. Máy chủ là ứng dụng Node.js sử dụng thư viện uWebSockets.js và máy khách là ứng dụng Unity sử dụng Websocket-Sharp thư viện . Cả hai chơi tốt với nhau và chúng tôi đã không gặp phải vấn đề gì với họ.
Gần đây, chúng tôi muốn kích hoạt tính năng nén websocket . Cả hai thư viện đều tuyên bố rằng họ hỗ trợ tiện ích mở rộng Nén tin nhắn nhưng có vẻ như có gì đó không tương thích với họ. Bởi vì khi chúng tôi định cấu hình để sử dụng nén, kết nối websocket sẽ đóng ngay lập tức khi bắt tay.
Chúng tôi cũng đã thử nghiệm ứng dụng khách với thư viện ws và nó cung cấp ví dụ để nén với kết quả tương tự. Chúng tôi đã thử mày mò các tùy chọn nén ws và thấy rằng khi chúng tôi nhận xét tùy chọn serverMaxWindowBits (mặc định là giá trị thương lượng), kết nối có thể được thiết lập và gửi và nhận tin nhắn hoạt động mà không gặp sự cố. Chúng tôi cũng đã hỏi về việc kiểm soát serverMaxWindowBits trong uWebsockets.
Điều cuối cùng chúng tôi đã thử là kết nối một máy chủ uWS tối thiểu và máy khách sắc nét websocket. Đây là mã cho máy chủ:
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);
}
});
Đây là mã khách hàng:
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);
}
}
}
}
Khi chúng tôi chạy máy chủ và máy khách, máy khách sẽ phát ra lỗi sau:
Lỗi | WebSocket.checkHandshakeResponse | Máy chủ chưa gửi lại 'server_no_context_takeover'. Fatal | WebSocket.doHandshake | Bao gồm tiêu đề Sec-WebSocket-Tiện ích mở rộng không hợp lệ.
Có vẻ như khách hàng mong đợi tiêu đề server_no_context_takeover và không nhận được tiêu đề. Chúng tôi đã xem xét nguồn uWebsockets (một phần C ++ của mô-đun uWebsockets.js) và tìm thấy một điều kiện nhận xét để gửi lại tiêu đề server_no_context_takeover. Vì vậy, chúng tôi đã bỏ qua điều kiện và xây dựng uWebsockets.js và thử nghiệm lại để gặp lỗi sau trong máy khách:
WebSocketSharp.WebSocketException: Không thể đọc tiêu đề của khung từ luồng.
Bất kỳ đề xuất để làm cho hai thư viện này làm việc cùng nhau?