Go言語とnetパッケージを使って独自のプロトコルを作ろう、パート1
TCPパッケージを使ってGo言語で独自のプロトコルを作るときは、クライアントとサーバーの間の通信に関する一連のルールを定義します。
これらのルールは、データの構造、メッセージのフレーミング、クライアントとサーバーのやり取りの仕方を決めます。
私たちは自分たちのカスタムプロトコルを作ります。
しかし、その前に、サーバーがあり、クライアントがサーバーに接続するカスタムのnet接続をgolangでどう実装するか知っておく必要があります。
クライアントがサーバーにメッセージを送り、それらのメッセージを単純に印刷します。
ビデオ形式で詳細な説明を好む場合はこちら
コードの説明
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チャンネルを購読してください。
twitterで私をフォローしてください 🐥
毎日の知識、興味深いトリビア、価値ある洞察を求めてTwitterで私に加わってください。
一緒に学習と発見の旅に出ましょう!インスピレーションと情報を得るために、私をフォローしてください。🚀
私のニュースレターを購読してください
私のコンテンツがお気に召したら、私の無料ニュースレターを購読してみてください。教育的で興味深く、技術的でキャリアに関する内容を直接あなたの受信箱に届けます。
重要なリンク
この記事を読んでくれてありがとうございました。今後もっと素晴らしいコンテンツを見るために、以下のリンクをフォローしてください。
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