closeWrite method for TCPConn type closes both side instead of one side

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

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.