github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2012/chat/tcp/chat.go (about)

     1  // +build OMIT
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"io"
     8  	"log"
     9  	"net"
    10  )
    11  
    12  const listenAddr = "localhost:4000"
    13  
    14  func main() {
    15  	l, err := net.Listen("tcp", listenAddr)
    16  	if err != nil {
    17  		log.Fatal(err)
    18  	}
    19  	for {
    20  		c, err := l.Accept()
    21  		if err != nil {
    22  			log.Fatal(err)
    23  		}
    24  		go match(c)
    25  	}
    26  }
    27  
    28  var partner = make(chan io.ReadWriteCloser)
    29  
    30  func match(c io.ReadWriteCloser) {
    31  	fmt.Fprint(c, "Waiting for a partner...")
    32  	select {
    33  	case partner <- c:
    34  		// now handled by the other goroutine
    35  	case p := <-partner:
    36  		chat(p, c)
    37  	}
    38  }
    39  
    40  func chat(a, b io.ReadWriteCloser) {
    41  	fmt.Fprintln(a, "Found one! Say hi.")
    42  	fmt.Fprintln(b, "Found one! Say hi.")
    43  	errc := make(chan error, 1)
    44  	go cp(a, b, errc)
    45  	go cp(b, a, errc)
    46  	if err := <-errc; err != nil {
    47  		log.Println(err)
    48  	}
    49  	a.Close()
    50  	b.Close()
    51  }
    52  
    53  func cp(w io.Writer, r io.Reader, errc chan<- error) {
    54  	_, err := io.Copy(w, r)
    55  	errc <- err
    56  }