Napisałem w C# serwer WebSocketowy, póki co obsługujący tylko sam protokół ws (bez wss). Starałem się go pisać tak, żeby tylko w przyzwoitych ramach łamał SRP (:P), więc gdyby ktoś miał czas zerknąć i powiedzieć co można zrobić lepiej to bardzo chętnie poczytam.
https://github.com/WodorHel/WebSocket-Server
Trochę kontekstu:
- Główną klasą jest WebSocketServer, który odpowiada za komunikację z użytkownikiem.
- Operacjami typowo sieciowymi zajmuje się klasa ServerListener, która obsługuje metody BeginReceive, EndReceive i całą resztę.
- Obsługą Handshakeu zajmuje się Protocol/Handshake/HandshakeResponseGenerator
- Rzeczy związane z serializacją/deserializacją ramki WebSocketowej są w Protocol/Frame
Z rzeczy które mi nie dają spokoju:
- W klasie WebSocketServer znajduje się metoda ProcessMessage która w zależności od typu ramki wykonuje odpowiednie operacje. Chętnie zmieniłbym to na jakąś fabrykę i po prostu wywoływał w jakimś FrameExecutor jedną metodę. Z tym że muszę wtedy jej przekazać cały obiekt WebSocketServer, ponieważ tylko stąd można wywołać odpowiedni event lub wysłać framkę Pong. Nie wiem czy to dobre rozwiązanie.
- Długo się zastanawiałem czy informacje o kliencie między warstwą WebSocketów (WebSocketServer), a warstwą sieciową (ServerListener) przekazywać za pomocą id (String clientID), czy za pomocą całego obiektu. Na ten moment jest to pierwsze, ale dalej mam wątpliwości.
PS. Przy okazji pragnę podziękować autorom Coyota za zapisywanie treści posta po wyjściu ze strony, właśnie uratowało mi to całą treść.
PS2. A jednak nie zapisało mi tagów, ale i tak dziękuję za uratowanie 5 minut życia.
back
obok niej…