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とネットワークプログラミングは相性が良い.