package main

import (
	"net"
	"io"
	"log"
)

func cliWrite(c net.Conn, ch chan []byte) {
	for {
		buff, ok := <-ch
		if !ok {
			break
		}
		n, err := c.Write(buff)
		if n == 0 || err != nil {
			break
		}
	}
}

func cliRead(c net.Conn, ch chan []byte) {
	for {
		buff := make([]byte, 64)
		n, err := io.ReadAtLeast(c, buff, 1)
		if n == 0 || err != nil {
			close(ch)
			c.Close()
			break
		}
		ch <- buff
	}
}

func main() {
	l, err := net.Listen("tcp", ":9999")
	if err != nil {
		log.Fatalf("listen failed:%v\n", err)
	}
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatalf("accept failed:%v\n", err)
		}
		ch := make(chan []byte, 10)
		go cliWrite(conn, ch)
		go cliRead(conn, ch)
	}
}