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