【Golang】Socket通信するプログラムを書いてみた

最近Go言語を勉強しています。リッチな言語とはいえないですがその分軽いですし、何より楽しいです。

 

golang.jpA Tour of Goをひと通り読み終えたのでまずはサーバとクライアントでSocket通信(のうちのTCP通信)を行うプログラムを書いてみました。

これを書くにあたって以下のページが非常に参考になりました。実際かなりお手本にさせてもらっています。

 

 

勉強、コーディングの手順としては

  1. golang.jpの必要なパッケージドキュメントを読む。
  2. 1を読んでどのようにコードを組んでいけば良いか分からなかったら参考になりそうなものを探す
  3. 参考にしているサイトで分からない関数が出てきたらgolang.jpに戻ってそこを読む
  4. 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]

の部分で実際に読み込んだ長さまでスライスしたものをキャストしてます。

 

 

次がクライアント側です。

GoでSocket通信プログラム(クライアント側)

 

一部参考にできそうなところがなく、netパッケージを何度も読みながら書いたので不格好なコードかもしれません。

とはいえこれで立派にSocket通信ができます。

 

両方を見てもらえば分かる通りクライアントから送られたメッセージに"too!"をつけて返すだけの簡単なものですがなかなか勉強になりました。

 

ここからどんどん改良して少しづつ複雑なものを作っていきたいです。

今クライアント側でサーバのIPやポートをハードコーディングしているのでこれを外側から変更できるようにするのがひとまずの目標です。

これを引数で指定できるようにするのがプログラミング初学習のセオリーっぽいですがさすがに面白く無いのでjsonからパースして読み込めるようにでもしたいですね。