TCP write【Go】
HTTPで動作するサーバーを作成するため、
TCPサーバーを、標準パッケージのnet packageを使って作成します。
TCPはサーバーとクライアント間の接続を事前に確立し、
通信相手ごとに通信の状態を管理します。
それゆえに信頼性は高いですが、コストのかかる通信方式です。
TCPに対してUDPという通信方式(プロトコル)があります。
UDPは事前処理や通信中の状態確認を行わないため、
通信コストが低く、遅延の少ないのが特徴です。
TCPサーバー作成の大まかな流れは
1. Listen
2. Accept
3. Write, Read
です。
サーバーはクライアントからの接続要求を待機します(Listen)。
接続要求があると、サーバーはそれを受け付けます(Accept)。
これによって、サーバーとクライアントの間に仮想的な接続(バーチャルサーキット)が作られます。
このバーチャルサーキットを通して、双方向でやり取りをします(Write, Read)。
バーチャルサーキットへのデータ送信では、データがそのまま反対側に転送されるため、
パケットロスなどの障害を考える必要がなく、書き込みと読み込みを行うことができます。
goプログラムによってTCPサーバーを作成し、
クライアントの役割として、ターミナルからtelnetという外部のコンピュータを遠隔操作するためのプロトコルを使用し、通信を行います。
main.goです。
io.WriteString、fmt.Fprintを使って書き込みを行います。
※ループを抜ける処理に関する記述がないため、
実行した後、プログラムを終了する場合はCtrl + Cを押下します。
li, err := net.Listen("tcp", ":8080") // tcpのnetworkのポート8080を監視する if err != nil { log.Panic(err) } defer li.Close() // プログラムが終了したら閉じる for { conn, err := li.Accept() // 接続要求があれば、それを受け付ける if err != nil { log.Println(err) } io.WriteString(conn, "\nHello from TCP server\n") // 確立したconnectionに対し、書き込みを行う fmt.Fprintln(conn, "How is your day?") // 確立したconnectionに対し、書き込みを行う fmt.Fprintf(conn, "%v", "Well, I hope!\n") // 確立したconnectionに対し、書き込みを行う conn.Close() // connectionを閉じる }
上記を実行したら、ターミナルからtelnetを実行します。
$ telnet localhost 8080 // localhostのポート8080に接続する
すると、次の結果が返ってきます。
Hello from TCP server How is your day? Well, I hope!