ドキュメント
WebSocketサーバー
2 min read
WebSocketサーバーはws://localhost:5555で接続を待ち受けます。
DrogonのSubscriberを使用します。
void MessageController::handleNewConnection(
const HttpRequestPtr &req,
const WebSocketConnectionPtr& conn)
{
// write your application logic here
LOG_DEBUG << "new websocket connection!";
Subscriber s;
s.chatRoomName_ = req->getParameter("websockets");
s.id_ = chatRooms_.subscribe(s.chatRoomName_,
[conn](const std::string& topic, const std::string& message) {
(void)topic;
conn->send(message);
});
conn->setContext(std::make_shared<Subscriber>(std::move(s)));
}
送られてきたメッセージがJson形式か確認しJson 形式の場合そのメッセージをコネクションに送信します。
void MessageController::handleNewMessage(
const WebSocketConnectionPtr& wsConnPtr,
std::string &&message,
const WebSocketMessageType &type)
{ // write your application logic here
//LOG_DEBUG << "new websocket message: " << message;
if (!spa::utils::json::readable(message))
return;
if (type == WebSocketMessageType::Ping)
{
// LOG_DEBUG << "recv a ping";
}
else if (type == WebSocketMessageType::Text)
{
LOG_DEBUG << "recv a message";
}
auto &s = wsConnPtr->getContextRef<Subscriber>();
chatRooms_.publish(s.chatRoomName_, message);
}
コネクション切断時に購読終了を処理します。
void MessageController::handleConnectionClosed(const WebSocketConnectionPtr& conn)
{
// write your application logic here
LOG_DEBUG << "websocket closed!";
auto &s = conn->getContextRef<Subscriber>();
chatRooms_.unsubscribe(s.chatRoomName_, s.id_);
}
コメントを残す