I’m reading gopl book and I with getting help form internet I coded for exercise 8.3
when I suppose to create a client that on pressing ctrl + d closes input and wait for server to write it’s response and then exit the program, but when I press ctrl + d it does not wait for the server
here is my codes
here is server code ;
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
"time"
)
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
continue
}
go handleConn(conn)
}
}
func echo(conn net.Conn, shout string, delay time.Duration){
fmt.Fprintln(conn, "\t", strings.ToUpper(shout))
time.Sleep(delay)
fmt.Fprintln(conn, "\t", shout)
time.Sleep(delay)
fmt.Fprintln(conn, "\t", strings.ToLower(shout))
}
func handleConn(conn net.Conn) {
input := bufio.NewScanner(conn)
for input.Scan() {
go echo(conn, input.Text(), 1*time.Second)
}
conn.Close()
}
and here is client code
package main
import (
"io"
"log"
"net"
"os"
)
func main() {
addr, err := net.ResolveTCPAddr("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
conn, err := net.DialTCP("tcp", nil, addr)
if err != nil {
log.Fatal(err)
}
done := make(chan struct{})
go func() {
io.Copy(os.Stdout, conn)
log.Print("done")
done<- struct{}{}
}()
mustCopy(conn, os.Stdin)
err = conn.CloseWrite()
if err != nil {
log.Fatal(err)
}
<-done
}
func mustCopy(dst io.Writer, src io.Reader){
_, err := io.Copy(dst, src)
if err != nil {
log.Fatal(err)
}
}
and this is console input and output
>>> A
A
A
a
>>>B
B
B
>>>A
A
b
A
a
>>>A
A
>>>CTRL + D
2021/05/16 04:30:29 done
and I use linux
I really tried but i don’t unserstand why after pressing ctrl + d it does not wait until echo is complete