导读:仅用大约 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 portnet.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:62556netstatcongTCP.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.goconcTCP.go TCP 服务端测试
nc是用 nc 工具作为 concTCP.go 的 TCP 客户端
ncnetcat总结
handleConnection()via:
本文由 原创编译, 荣誉推出
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “ 转载:公众号名称”,
我们将为您添加白名单,授权“ 转载文章时可以修改”。