github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2012/chat/tcp-simple/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) // HL
    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  	go io.Copy(a, b)
    44  	io.Copy(b, a)
    45  }