【Golang】Socket通信するプログラムを書いてみた
最近Go言語を勉強しています。リッチな言語とはいえないですがその分軽いですし、何より楽しいです。
golang.jpやA Tour of Goをひと通り読み終えたのでまずはサーバとクライアントでSocket通信(のうちのTCP通信)を行うプログラムを書いてみました。
これを書くにあたって以下のページが非常に参考になりました。実際かなりお手本にさせてもらっています。
- net パッケージ - golang.jp
- os パッケージ - golang.jp
- 8.1 Socketプログラミング
- Golang Cafe #15 まとめ netパッケージ - taknb2nchのメモ
勉強、コーディングの手順としては
- golang.jpの必要なパッケージドキュメントを読む。
- 1を読んでどのようにコードを組んでいけば良いか分からなかったら参考になりそうなものを探す
- 参考にしているサイトで分からない関数が出てきたらgolang.jpに戻ってそこを読む
- golang.jpに載っていない関数などは本家を探す
という感じです。
以下がコードです。
まずはサーバ側
55555ポートを監視し続け、クライアントから接続されたらゴルーチンを作成しその中でR/Wしています。
接続ごとにR/Wの処理部分をゴルーチンとして切りだすのでクライアントからの複数の接続を捌けます。
ここを書いているときに「スライス便利だな」と思いました。
messageBuf := make([]byte, 1024)messageLen, err := conn.Read(messageBuf)checkError(err)message := string(messageBuf[:messageLen])
Read関数はJavaなどと同じような使い方です。引数のbyte配列に読み込んだバイト列が入ります。これをstring型にキャストして保持するのですが、読み込んだバイト列は予め確保しておいた配列の長さより短い可能性が高いです。
そのため
messageBuf[:messageLen]
の部分で実際に読み込んだ長さまでスライスしたものをキャストしてます。
次がクライアント側です。
一部参考にできそうなところがなく、netパッケージを何度も読みながら書いたので不格好なコードかもしれません。
とはいえこれで立派にSocket通信ができます。
両方を見てもらえば分かる通りクライアントから送られたメッセージに"too!"をつけて返すだけの簡単なものですがなかなか勉強になりました。
ここからどんどん改良して少しづつ複雑なものを作っていきたいです。
今クライアント側でサーバのIPやポートをハードコーディングしているのでこれを外側から変更できるようにするのがひとまずの目標です。
これを引数で指定できるようにするのがプログラミング初学習のセオリーっぽいですがさすがに面白く無いのでjsonからパースして読み込めるようにでもしたいですね。