【目次】
送信処理の実装
サーバ側での受信処理
クライアント側での受信処理
チャットログの表示処理
送信処理の実装▲
シンプルなエコー送受信を用いて、シンプルなチャットを作ってみましょう。
まずは簡素なGUIを用意するところから始めてみましょう。
■ ChatScene::menuChatCallback 関数から、チャット文字列を送信する
送信ボタン押下時に、echoサンプルの文字列送信と同じようにサーバへ送信する処理を組み込みます。
今回はイベントキーを「2」に、送信文字列を「名前:本文」となるよう送信します。
前述のページで触れた ChatScene.cpp を開き、最後の「 // TODO : チャット送信 」となっている箇所について
以下のように書き換えてください。
// チャット送信
MainExecute::GetClient()->SendServer(2, NameEntry::GetName() + " : " + m_ChatSentence + "\n");

サーバ側での受信処理▲
■ 受信制御を組み込む
サーバ側の受信処理については「プログラム解説」の項目にも記載しましたが、
EchoClient.SendServer で送られてくるイベントキーによって「どんな処理を行うか」について記述します。
デフォルトの状態だと、「送信元のクライアントに」送信する形になっていますが、一般的なチャットを考えると
「現在接続している全てのクライアントに」発言内容を送信する形にしなければなりません。
先に「イベントキー」として「2」を設定したのはそのためで、server/echo_sample/src/MainExecute.cpp にある
SendMessage 関数に、以下のケースを追加して無条件で送信します。
SendMessage 関数そのものは「接続中の全クライアントに対し等しく呼び出される関数」ですので、
無条件で Send_EchoResult() をコールすれば全員にコールが帰ります。
case 2: // CHAT本文
{
// 全員に送信
GetInterface_Intf(peerRpcId).Send_EchoResult( eventId, pData );
}
break;

クライアント側での受信処理▲
■ チャットログ用文字列リストを用意する
まず始めに、クライアントから受信してきた文字列情報をチャットのログとして表示するために
受信した文字列をバッファに持つ文字列リストを用意しましょう。
MainExecute.h を開き、以下の部分を追記してください。

また MainExecute.cpp に以下の部分を追加し、関数 MainExecute::GetChatLog() を作ります。
std::list<std::string> MainExecute::m_ChatLog;
std::string MainExecute::GetChatLog()
{
std::string retStr = "";
for( std::list<std::string>::iterator it = m_ChatLog.begin(); it != m_ChatLog.end(); it++ )
{
retStr += *it;
}
return retStr;
}

■ クライアント側でチャットログを更新する
サーバから受信してきた情報は MainExecute.cpp の OnEvent メソッドで受け取ることが出来ますので、
イベントキー「2」に基づいたチャットログに更新を掛けます。
case 2:
{
// イベント2ならチャット
if( m_ChatLog.size() >= 8 )
{
m_ChatLog.pop_front();
}
m_ChatLog.push_back(str);
}
break;

チャットログの表示処理▲
■ チャットログを表示する
上記で設定した チャットログ文字列 m_ChatLog に対し、チャット中のGUI、すなわち ChatScene.cpp 内で
表示するように処理を組み込みましょう。
ChatScene.cpp の Chat:update 関数内にて " // TODO : チャット受信情報の表示 "
と書かれている箇所を
以下のように書き換えてください。
// チャット受信情報の表示
m_pLabel->setString(MainExecute::GetChatLog().c_str());
