テキストファイルを用いたIPC
異なるプロセス(ソフト)間でデータの共有・連携をする際にIPC(プロセス間通信)を使用する。 GoでIPCをやろうと思ってみたら、なかなか簡単な方法が見つからなかったので ファイルの読み書きを使用したシンプルなIPCを実験してみた。テキストファイルIPCのメリット
仕組みがシンプル(テキストファイルの読み取り、書き出しだけで出来る) 全く異なる言語で作成したソフト間でも確実にデータ連携が可能。実験内容
ソフトウェア上で入力した文字列を、もう一方のソフトで表示させる。 C#(WPF)で文字列を入力・送信するソフトを作成し、送信すると入力文字列がテキストファイルに書き込まれる。 Goで入力された文字列をPrintするCLIを作成する。テキストファイルを読み取り、中身が変わったらCLI上にPrintする。 WPFには最終更新日時を表示させておく。Goが文字列をPrintしたら、テキストファイルにその際の日時を書きだす。 文字列・更新日時の読み取り間隔は5秒間 C:\Users\Public\DocumentにData.txt(文字列連携用テキスト)とLastUpdate.txt(更新日時連携用テキスト)を入れて使う。 ![IPCイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/db536e30-a5de-eccd-dbfe-be53dc1c8c5d.png)動作環境
OS:Windows 10 WPFアプリケーション:.Net Core 3.1 (C#で作成) GO:version 1.15.5テキストファイルIPCのソースコード
```Go package mainimport (
"time"
"fmt"
"io/ioutil"
)
func Receive(ch1 chan string){
for{
data, _:=ioutil.ReadFile("C:\Users\Public\Documents\Data.txt")
ch1<-string(data)
time.Sleep(5*time.Second)
}
}
func Date(ch2 chan string){
for{
now:=time.Now().Format("2006-01-02 15:04:05")
ch2<-now
time.Sleep(5*time.Second)
}
}
func main(){
ch1:=make(chan string)
ch2:=make(chan string)
go Receive(ch1)
go Date(ch2)
var prevdata string=""
for{
msg1:=<-ch1
msg2:=<-ch2
if prevdata != msg1{
fmt.Println(msg1)
_=ioutil.WriteFile("C:\Users\Public\Documents\LastUpdate.txt",[]byte(msg2),0644)
prevdata = msg1
}
}
}
io/ioutilを使用してテキストファイルの読み取り/書き出しを実行。
Receiverゴルーチンでテキストファイルを読み取り、ch1に読み取った値を入れてます。
Dateゴルーチンで日時を取得し、ch2を経由してテキストファイルに書き出します。
(並列処理ではなく)2つのプロセスをわかりやすく分けるため、今回はゴルーチンにしました。
time.Sleepで5秒間隔に読み取り・書き出しを行っています。
更新がない場合にPrintしないよう、prevdata変数を判定に使用してます。
![Tx_main.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/e76a719c-bcb9-ec03-db92-52eb64c44a5f.png)
WPFアプリケーションはこのような感じ。
GoのCLIと異なるのはTextBoxがあるくらいで、処理はほとんど同じ。
<h1>結果</h1>
![Rx_main.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/1bce6201-6a55-3e80-2365-153f9f548cf4.png)
「吾輩は猫である」と表示されてるときに「名前はまだない」と入力したら
![IPC.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/25f55b88-a47b-ff81-aedd-9d4d05bef793.png)
Go側にちゃんと「名前はまだない」が表示された。
<h1>最後に</h1>
WPFとGolangでデータ連携が出来たということは、デスクトップ上のクライアントからWebアプリに容易にデータ送信できるかもしれない。
全く異なるプログラミング言語やプラットフォーム同士の連携も、テキストファイルなら簡単に出来るのかも。
<h1>引用・参考文献</h1>
https://www.udemy.com/share/101XCSAEMZdFZXTHQG/
ゴルーチンとioutilの使用方法は、酒井潤先生のこちらのUdemy講座を参考にしました。
https://icooon-mono.com/ (WPFアプリアイコン)
https://www.silhouette-illust.com/ (テキストファイル・CLIアイコン)
イラストにアイコンを使用させていただきました。
https://qiita.com/navel3/items/cec4a8875faa8644d8db
navel3さん記事 ソケットを利用したIPCパッケージを作成しています。