技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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!