Go言語とnetパッケージを使って独自のプロトコルを作ろう、パート1

TCPパッケージを使ってGo言語で独自のプロトコルを作るときは、クライアントとサーバーの間の通信に関する一連のルールを定義します。

これらのルールは、データの構造、メッセージのフレーミング、クライアントとサーバーのやり取りの仕方を決めます。


私たちは自分たちのカスタムプロトコルを作ります。

しかし、その前に、サーバーがあり、クライアントがサーバーに接続するカスタムのnet接続をgolangでどう実装するか知っておく必要があります。

クライアントがサーバーにメッセージを送り、それらのメッセージを単純に印刷します。

ビデオ形式で詳細な説明を好む場合はこちら

https://www.youtube.com/watch?v=t5u-iHBgEUY

コードの説明

func main() {
 // localhost:3000にTCPリスナーを作成する
 l, err := net.Listen("tcp", "localhost:3000")
 if err != nil {
  log.Fatalln("ネットワークのリッスンができない")
 }
}

全画面モード終了

main 関数: これはプログラムの入り口です。以下のことを行います。

net.Listen 関数を使って、ポート3000でlocalhostにTCPリスナーを作成することを試みます。

この過程でエラーが発生した場合、エラーメッセージをログに記録し、log.Fatalln を使ってプログラムを終了します。

 for {
  conn, err := l.Accept()
  if err != nil {
   log.Fatalln("接続の受け入れ中にエラー", err)
  }
  go handle(conn)
 }
}

全画面モード終了

接続を受け入れる: 無限forループの中で、コードは以下のことを行います...

l.Accept() を使って来るクライアントの接続を待ちます。クライアント接続が承認されると、新しい接続オブジェクト(conn)と潜在的なエラーを返します。

接続の承認中にエラーが生じた場合、エラーメッセージをログに記録し、接続を待ち続けます。

接続が正常に承認された場合、引数としてconnを持つhandle関数を呼び出すことで新しいgoroutineを開始します。

これにより、サーバーは同時に複数のクライアント接続を処理することができます。

func handle(conn net.Conn) {
 // 接続が閉じられるまで、接続からすべてのメッセージを読み続けます。
 fmt.Println("connected to: ", conn.RemoteAddr())
 for {
  var buffer [1024]byte // データを読むための1KBバッファー
  _, err := conn.Read(buffer[:])
  if err != nil {
   log.Printf("接続から読み込む際のエラー: %v, 終了中...", err)
   return
  }
  fmt.Println("読み取りメッセージ: ", string(buffer[:]))
 }
}

全画面モード終了

handle 関数: この関数は各クライアント接続に対して呼び出されます。接続したクライアントとの通信を処理します。

接続が確立されたことを示すメッセージと、クライアントのリモートアドレスを含めて印刷します。

ループの中で、1KBのバッファー(buffer)を使用して、conn.Read()を使いクライアント接続からデータを読み取ります。

クライアントからデータを読み取り中にエラーが発生した場合、エラーメッセージをログに記録し、関数からリターンします。これにより、接続を効果的に閉じます。

さもなくば、受信したメッセージをコンソールに印刷します。

拍手をお願いします!

この記事が役に立ったと思ったら、拍手👏👏👏👏をいただけると嬉しいです。それが私に、将来もこうした役立つ記事を書き続けるモチベーションになります。

定期的な素晴らしいコンテンツや洞察を求めてフォローしてください。

私のYoutubeチャンネルを購読してください

もっと素晴らしいコンテンツをビデオ形式で探している方は、私のYoutubeチャンネルを購読してください。

https://www.youtube.com/@dsysd-dev

twitterで私をフォローしてください 🐥

毎日の知識、興味深いトリビア、価値ある洞察を求めてTwitterで私に加わってください。

一緒に学習と発見の旅に出ましょう!インスピレーションと情報を得るために、私をフォローしてください。🚀

https://twitter.com/dsysd_dev

私のニュースレターを購読してください

私のコンテンツがお気に召したら、私の無料ニュースレターを購読してみてください。教育的で興味深く、技術的でキャリアに関する内容を直接あなたの受信箱に届けます。

https://dsysd.beehiiv.com/subscribe

重要なリンク

この記事を読んでくれてありがとうございました。今後もっと素晴らしいコンテンツを見るために、以下のリンクをフォローしてください。

Twitter: https://twitter.com/dsysd_dev
Youtube: https://www.youtube.com/@dsysd-dev
Github: https://github.com/dsysd-dev
Medium: https://medium.com/@dsysd-dev
メール: dsysd.mail@gmail.com
Telegram 📚: https://t.me/dsysd_dev_channel
Linkedin: https://www.linkedin.com/in/dsysd-dev/
Newsletter: https://dsysd.beehiiv.com/subscribe
Gumroad: https://dsysd.gumroad.com/
Dev.to: https://dev.to/dsysd_dev/

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/dsysd_dev/lets-build-our-own-protocol-using-tcp-and-net-package-in-go-part-1-3jhj