net.ConnのSetDeadline()メソッドを使うと、
接続の有効期限を指定することができます。
func main() {
li, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
for {
conn, err := li.Accept()
if err != nil {
log.Fatal(err)
}
go handle(conn)
}
}
func handle(conn net.Conn) {
err := conn.SetDeadline(time.Now().Add(10 * time.Second))
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
ln := scanner.Text()
fmt.Println(ln)
fmt.Fprintf(conn, "You said, %v", ln)
}
if err := scanner.Err(); err != nil {
fmt.Println(err) // クライアントが接続してからSetDeadlineの期限を超過すると、ここを通るため、log.Fatal()を使うと、サーバープログラムが終了してしまうので注意
}
defer conn.Close()
}
これはあくまで、クライアントの期限であり、サーバーのプログラムの有効期限ではありません。
クライアントが接続を開始してから指定時間を過ぎると、クライアント側の接続が切れます。
複数クライアントを同時に接続することは、もちろん可能ですし、
有効期限も、それぞれのクライアントで管理されます。
scanner.Err()は、1行あたりのサイズが上限を超えてエラーになった場合に原因を把握するために用意しています。
ただ、SetDeadlineの期限切れるとこの場所を通過するため、
log.Fatal()を用いるとサーバープログラムが終了してしまうので注意が必要です。