Siv3Dと*.jarファイルでパイプ通信だ!


2017/11/14 追記
この方法でJar起動すると、Siv3Dの実行を止めてもJarが停止しません。ゾンビ化します。なので、パイプ通信で終了コマンドをJarファイルに作成して、Jarファイルが能動的に停止する必要があります。


お久しぶりです。このブログまだ記事が9個しかないんですねぇ、、、

はい!というわけで、どういうわけで(?)Siv3DとJavaWindowsのパイプ通信を行います。Linuxのパイプとは少し状況が違って、標準入出力を実行中にくっつけてしまうイメージです。TCP通信みたいに使えるわけです。

が!そんな簡単にうまいこと行かないのがこの世界です。
Siv3DからJarファイルを起動しても、標準入出力がつながらないという問題が発生しました。

原因

Siv3DのPipeServerはダブルクリックで起動したときと同じ動作をしているようです(多分あってない)。Windowsの仕様で、Jarファイルをダブルクリックで起動しても、コマンドプロンプトで開かれる訳では無いようです。結果、Jarファイルを実行しても、標準入出力に接続されていません。

対策

ならば、コマンドプロンプトから開けるようにしてやればよいのです。ということで、おもむろに「execute_jar.bat」ファイルを作ります。ちなみに、WinPipe_Test.jarの中では、Siv3Dのサンプルと同じことをしています。

@echo off
rem "excute_jar.bat"
rem jarファイルを実行。echo offで実行時のコマンドを表示しない。

java -jar WinPipe_Test.jar

そして、Siv3Dからはこの「execute_jar.bat」ファイルを実行します。

# include <Siv3D.hpp>

void Main() {
	// クライアントを起動
	PipeServer server(L"execute_jar.bat");

	if (!server) {
		return;
	}
	//
	///////////////////////////////////

	while (System::Update()) {
		if (Input::KeyA.clicked) {
			Print(L"10*2=");

			server.write("10 2\n");
		}

		if (Input::KeyB.clicked) {
			Print(L"3*4=");

			server.write("3 4\n");
		}

		if (server.available()) {
			std::string str;

			server.read(str);

			Print(Widen(str));
		}
	}

	server.write("quit\n");
}