Skip to content

Commit 92718aa

Browse files
enables server to receive binary msgs over WebSocket
1 parent f898b11 commit 92718aa

3 files changed

Lines changed: 39 additions & 7 deletions

File tree

include/network/WebSocketSession.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ class WebSocketSession : public IConnection, public std::enable_shared_from_this
5353

5454
std::string GetRemoteAddress() const override;
5555

56+
using BinaryMessageHandler = std::function<void(uint16_t, const std::vector<uint8_t>&)>;
57+
void SetBinaryMessageHandler(BinaryMessageHandler handler);
58+
void SetDefaultBinaryMessageHandler(BinaryMessageHandler handler);
59+
5660
private:
5761
WebSocketProtocol::WebSocketConnection::Pointer wsConn_;
5862
uint64_t sessionId_;
@@ -77,7 +81,10 @@ class WebSocketSession : public IConnection, public std::enable_shared_from_this
7781
mutable std::mutex propertiesMutex_;
7882
std::map<std::string, std::string> properties_;
7983

84+
BinaryMessageHandler binary_handler_;
85+
BinaryMessageHandler default_binary_handler_;
86+
8087
// Internal helpers
8188
void OnMessage(const WebSocketProtocol::WebSocketMessage& msg);
8289
void OnClose(uint16_t code, const std::string& reason);
83-
};
90+
};

src/network/GameServer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ void GameServer::DoAccept() {
102102
if (webSocketFactory_) {
103103
auto wsConn = webSocketFactory_(std::move(socket), sslContext_);
104104
auto session = std::make_shared<WebSocketSession>(wsConn);
105+
session->SetBinaryMessageHandler([world](uint16_t type, const std::vector<uint8_t>& data) {
106+
world->HandleBinaryMessage(type, data); // Your world's binary handler
107+
});
105108
ConnectionManager::GetInstance().Start(session);
106109
session->Start();
107110
} else {

src/network/WebSocketSession.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,31 @@ std::string WebSocketSession::GetRemoteAddress() const {
135135
}
136136

137137
void WebSocketSession::OnMessage(const WebSocketProtocol::WebSocketMessage& msg) {
138-
if (messageHandler_) {
139-
if (msg.opcode == WebSocketProtocol::OP_TEXT) {
138+
if (msg.opcode == WebSocketProtocol::OP_TEXT) {
139+
if (messageHandler_) {
140140
try {
141141
auto json = nlohmann::json::parse(msg.GetText());
142142
messageHandler_(json);
143143
} catch (const std::exception& e) {
144144
Logger::Error("WebSocketSession: invalid JSON: {}", e.what());
145145
}
146-
} else if (msg.opcode == WebSocketProtocol::OP_BINARY) {
147-
// Binary message handling – can be extended to parse binary protocol
148-
Logger::Debug("WebSocket binary message received, size: {}", msg.data.size());
146+
}
147+
} else if (msg.opcode == WebSocketProtocol::OP_BINARY) {
148+
// Deserialize as BinaryMessage
149+
try {
150+
auto binaryMsg = BinaryProtocol::BinaryMessage::Deserialize(
151+
msg.data.data(), msg.data.size());
152+
if (binary_handler_) {
153+
binary_handler_(binaryMsg.header.message_type, binaryMsg.data);
154+
} else if (default_binary_handler_) {
155+
default_binary_handler_(binaryMsg.header.message_type, binaryMsg.data);
156+
} else {
157+
Logger::Warn("WebSocketSession {}: no binary handler for message type {}",
158+
sessionId_, binaryMsg.header.message_type);
159+
}
160+
} catch (const std::exception& e) {
161+
Logger::Error("WebSocketSession {}: failed to deserialize binary message: {}",
162+
sessionId_, e.what());
149163
}
150164
}
151165
}
@@ -155,4 +169,12 @@ void WebSocketSession::OnClose(uint16_t code, const std::string& reason) {
155169
if (closeHandler_) {
156170
closeHandler_();
157171
}
158-
}
172+
}
173+
174+
void WebSocketSession::SetBinaryMessageHandler(BinaryMessageHandler handler) {
175+
binary_handler_ = std::move(handler);
176+
}
177+
178+
void WebSocketSession::SetDefaultBinaryMessageHandler(BinaryMessageHandler handler) {
179+
default_binary_handler_ = std::move(handler);
180+
}

0 commit comments

Comments
 (0)