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