TCP 和 UDP 服务端随处可见,它们基于 TCP/IP 协议栈,通过网络为客户端提供服务。在这篇文章中,我将介绍如何使用 Go 语言开发一个用于返回随机数、支持并发的 TCP 服务端。对于每一个来自 tcp 客户端的连接,它都会启动一个新的 Go routine(轻量级线程)来处理相应的请求。

你可以在 GitHub 上找到本项目的源码:concTcp.go。

处理 TCP 连接

handleConnection 
 func handleConnection(c net.Conn) {
        fmt.Printf("Serving %s\n", c.RemoteAddr.String)
        for {
                netData, err := bufio.NewReader(c).ReadString('\n')
                if err != nil {
                        fmt.Println(err)
                        return
                }

                temp := strings. Trim Space(string(netData))
                if temp == "STOP" {
                        break
                }

                result := strconv.Itoa(random) + "\n"
                c.Write( byte (string(result)))
        }
        c.Close
}
  
for for bufio.NewReader(c).ReadString('\n') c.Write(byte(string(result))) 

支持并发

main 
 func main {
        arguments := os.Args
        if len(arguments) == 1 {
                fmt.Println("Please provide a port  number !")
                return
        }

        PORT := ":" + arguments[1]
        l, err := net.Listen("tcp4", PORT)
        if err != nil {
                fmt.Println(err)
                return
        }
        defer l.Close
         rand .Seed(time.Now.Unix)

        for {
                c, err := l.Accept
                if err != nil {
                        fmt.Println(err)
                        return
                }
                go handleConnection(c)
        }
}
  
main net.Listen 
 $ go run concTCP.go 12a
listen tcp4: lookup tcp4/12a: nodename nor servname provided, or not known
$ go run concTCP.go -10
listen tcp4: address -10: invalid port
  
net.Listen net.Conn io.Reader io.Writer main rand.Seed for Accept handleConnection(c) 

net.Listen 的第一个参数

net.Listen tcp tcp4 tcp6 udp udp4 udp6 ip ip4 ip6  Unix  Unixgram Unixpacket tcp4 udp4 ip4 tcp6 udp6 ip6 

服务端并发测试

concTCP.go 
 $ go run concTCP.go 8001
Serving  127.0.0.1 :62554
Serving 127.0.0.1:62556
  
 netstat  congTCP.go 
 $ netstat -anp TCP | grep 8001
tcp4       0      0  127.0.0.1.8001         127.0.0.1.62556        ESTABLISHED
tcp4       0      0  127.0.0.1.62556        127.0.0.1.8001         ESTABLISHED
tcp4       0      0  127.0.0.1.8001         127.0.0.1.62554        ESTABLISHED
tcp4       0      0  127.0.0.1.62554        127.0.0.1.8001         ESTABLISHED
tcp4       0      0  *.8001                 *.*                    LISTEN
  

在上面输出中,最后一行显示了有一个进程正在监听 8001 端口,这意味着你可以继续连接 TCP 的 8001 端口。第一行和第二行显示了有一个已建立的 TCP 网络连接,它占用了 8001 和 62556 端口。相似地,第三行和第四行显示了有另一个已建立的 TCP 连接,它占用了 8001 和 62554 端口。

concTCP.go 

nc 

nc netcat 

总结

handleConnection 

via:

本文由 LCTT原创编译,Linux中国荣誉推出