2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Siv3DAdvent Calendar 2024

Day 17

Siv3DでWebSocket通信したい!

Posted at

はじめに

みなさんこんにちは!
緑獺おがめです。
こちらは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();
		}
	}
}

image.png

helloと送ると、エコーサーバーなのでそのまま返ってきますね。
どうやらうまくいってそうです。

ただ、終了処理がまだうまくいっておらず、現在は正常終了してくれないのでタスクキルしています。

課題点

いくつかあります。

  • SSL化の方法は現在の実装で良いのか(多分良くない)
  • 正常終了する
  • 色々整える

これらをクリアしなければなと思いました。

終わりに

最後まで読んでいただきありがとうございました!
体調が治ってから大急ぎで書いていますので至らぬ点もあるかと思いますが、大目に見ていただけると助かります。

ではまた~~。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?