電気ひつじ牧場

技術メモと日常のあれこれ

GolangでTCPエコーサーバを作る

golangを使って普通のエコーサーバを作成する.

サーバの仕様

  • TCP:8888でリッスンする
  • 複数クライアントの同時接続を可能にする
package main

import (
    "fmt"
    "io"
    "net"
    "os"
)


func main() {
    listener, err := net.Listen("tcp", "0.0.0.0:8888")
    if err != nil {
        panic(err)
    }
    defer listener.Close()
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Fprintf(os.Stderr, err.Error())
            continue
        }
        defer conn.Close()
        go func() {
            for {
                buf := make([]byte, 1500)
                n, err := conn.Read(buf)
                if err != nil {
                    if err != io.EOF {
                        fmt.Fprintln(os.Stderr, err.Error())
                    }
                    break
                }
                fmt.Println("\n-------------")
                fmt.Printf("received from %v\n", conn.RemoteAddr().String())
                fmt.Printf("%v", string(buf[:n]))

                _, err = conn.Write(buf[:n])
                if err != nil {
                    fmt.Fprintln(os.Stderr, err.Error())
                    break
                }
            }
        }()
    }
}

おわりに

Rustの実装と見比べてみると面白いかも. Rustではクライアントから切断された場合,Readは0を返すのに対して,golangではio.EOFのエラーとなる.

並行処理が簡単に書けるためgolangとネットワークプログラミングは相性が良い.