はじめに
みなさんこんにちは!
緑獺おがめです。
こちらはSiv3D AdventCalendar2024 17日目の記事です。
16日目くらいから体調不良で寝込んでおり、全く記事を書けておらず、大遅刻となりますがこちらの記事を執筆しています。
すみませんでした。
きっかけ
Siv3Dの開発、なにか手伝えることないかなぁとGitHubのIssueを眺めていたんですが……。
流石Siv3Dですよね。な~~んにもわかりません。
手伝えることないなぁ、なんかないかなぁと思っていた矢先にですn、気づいてしまったんですよ。
「……あれ? WebSocket通信サポートしてなくね……?」
まあ急を要するほどのものでもないのですが、せっかくならあるとSiv3Dの幅も広がりますし、なにより私でも実装出来そう……!
ということでやってみようとなりました。
ちなみにまだ完成はしていません。あしからず。
ライブラリ選定
さあ、開発をしていきましょう。
Siv3DはC++で開発されているので、それに合わせて選ぶことになります。
調べると色々出てきました。
- Boost
- Websocketpp
- Civet
- etc...
結論としては、Boostを用いることにしました。
既にSiv3D内で用いられているため、導入にさほど手間もないかなと考えました。
また、SSL化のためにOpenSSLも用いています。
コーディング
ごりごりコーディングしていきます。
Boost.BeastのサンプルコードとにらめっこしながらSiv3Dっぽい実装を考えました。
ソースは以下に貼っておきます。
https://github.com/Ogame3334/Siv3DWSClient
Main.cppに以下を記述することで用いることができます。
また、ビルドには/bigobj
のオプションが必要になります。
#include <Siv3D.hpp>
#include "include/WSClient.hpp"
void Main() {
System::SetTerminationTriggers(UserAction::CloseButtonClicked);
ogm::WSClient client;
client.onMessage([](const StringView message) {
Print << message;
});
client.onClose([] {Print << U"websocket通信は正常に閉じられました"; });
client.onError([](const StringView message) {
Print << message;
});
client.onOpen([] {Print << U"接続がオープンしました"; });
client.open(U"echo.websocket.org", 443);
TextEditState textEdit;
while (System::Update()) {
if (KeyEscape.down()) {
client.close();
}
SimpleGUI::TextBox(textEdit, Vec2{ 100, 100 });
if (SimpleGUI::Button(U"send", Vec2{ 100, 200 })) {
client.send(textEdit.text);
textEdit.clear();
}
}
}
helloと送ると、エコーサーバーなのでそのまま返ってきますね。
どうやらうまくいってそうです。
ただ、終了処理がまだうまくいっておらず、現在は正常終了してくれないのでタスクキルしています。
課題点
いくつかあります。
- SSL化の方法は現在の実装で良いのか(多分良くない)
- 正常終了する
- 色々整える
これらをクリアしなければなと思いました。
終わりに
最後まで読んでいただきありがとうございました!
体調が治ってから大急ぎで書いていますので至らぬ点もあるかと思いますが、大目に見ていただけると助かります。
ではまた~~。