jay's blog
golang
package main

import (
    "net"
    "bufio"
    "strconv"
    "fmt"
)

const PORT = 3540

func main() {
    server, err := net.Listen("tcp", ":" + strconv.Itoa(PORT))
    if server == nil {
        panic("couldn't start listening: " + err.String())
    }
    conns := clientConns(server)
    for {
        go handleConn(<-conns)
    }
}

func clientConns(listener net.Listener) chan net.Conn {
    ch := make(chan net.Conn)
    i := 0
    go func() {
        for {
            client, err := listener.Accept()
            if client == nil {
                fmt.Printf("couldn't accept: " + err.String())
                continue
            }
            i++
            fmt.Printf("%d: %v <-> %v\n", i, client.LocalAddr(), client.RemoteAddr())
            ch <- client
        }
    }()
    return ch
}

func handleConn(client net.Conn) {
    b := bufio.NewReader(client)
    for {
        line, err := b.ReadBytes('\n')
        if err != nil { // EOF, or worse
            break
        }
        client.Write(line)

	//buf := make([]byte, 1024)
	//n, err := client.Read(buf[:]) // recv data
	//if err != nil {
	//	if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
	//		log.Println("read timeout:", err)
	//		// time out
	//	} else if err == io.EOF {
	//		//
	//	} else {
	//		log.Println("read error:", err)
	//		// some error else, do something else, for example create new conn
	//	}
	//	break
	//}
	//fmt.Print(string(buf[:n]))
	//client.Write(buf[:n])
    }
}

//来源:https://gist.github.com/paulsmith/775764

最后修改于 2022-07-12