导读:仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。

本文字数:5801,阅读时长大约: 6分钟

LCTT 译者 :六开箱

翻译: 61.0 篇

贡献: 67 天

2022-03-16

2022-05-21

https://linux.cn/lctt/lkxed

仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。

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

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

处理 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.TrimSpace(string(netData))if temp == "STOP" {break}result := strconv.Itoa(random()) + "\n"c.Write([]byte(string(result)))}c.Close()}
forforbufio.NewReader(c).ReadString('\n')c.Write([]byte(string(result)))

支持并发

main()
func main() {arguments := os.Argsif 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 12alisten tcp4: lookup tcp4/12a: nodename nor servname provided, or not known$ go run concTCP.go -10listen tcp4: address -10: invalid port
net.Listen()net.Connio.Readerio.Writermain()rand.Seed()forAccept()handleConnection(c)

net.Listen() 的第一个参数

net.Listen()tcptcp4tcp6udpudp4udp6ipip4ip6UnixUnixgramUnixpackettcp4udp4ip4tcp6udp6ip6

服务端并发测试

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

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

concTCP.go


concTCP.go TCP 服务端测试

nc


是用 nc 工具作为 concTCP.go 的 TCP 客户端

ncnetcat

总结

handleConnection()

via:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。