ドキュメント

View Categories

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_);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です