范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

在Go中实现一个支持并发的TCP服务端

  仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。
  TCP 和 UDP 服务端随处可见,它们基于 TCP/IP 协议栈,通过网络为客户端提供服务。在这篇文章中,我将介绍如何使用 Go 语言开发一个用于返回随机数、支持并发的 TCP 服务端。对于每一个来自 TCP 客户端的连接,它都会启动一个新的 goroutine(轻量级线程)来处理相应的请求。
  你可以在 GitHub 上找到本项目的源码:concTcp.go。
  处理 TCP 连接
  这个程序的主要逻辑在 handleConnection函数中,具体实现如下:func handleConnection(c net.Conn) {         fmt.Printf("Serving %s ", c.RemoteAddr.String)         for {                 netData, err := bufio.NewReader(c).ReadString(" ")                 if err != nil {                         fmt.Println(err)                         return                 }                  temp := strings.TrimSpace(string(netData))                 if temp == "STOP" {                         break                 }                  result := strconv.Itoa(random) + " "                 c.Write(byte(string(result)))         }         c.Close }
  如果 TCP 客户端发送了一个 "STOP" 字符串,为它提供服务的 goroutine 就会终止;否则,TCP 服务端就会返回一个随机数给它。只要客户端不主动终止,服务端就会一直提供服务,这是由 for循环保证的。具体来说,for循环中的代码使用了bufio.NewReader(c).ReadString(" ")来逐行读取客户端发来的数据,并使用c.Write(byte(string(result)))来返回数据(生成的随机数)。你可以在 Go 的 net 标准包文档中了解更多。
  支持并发
  在 main函数的实现部分,每当 TCP 服务端收到 TCP 客户端的连接请求,它都会启动一个新的 goroutine 来为这个请求提供服务。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确保程序至少有一个命令行参数。注意,现有代码并没有检查这个参数是否为有效的 TCP 端口号。不过,如果它是一个无效的 TCP 端口号,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函数用于告诉 Go 接受网络连接,因而承担了服务端的角色。它的返回值类型是net.Conn,后者实现了io.Reader和io.Writer接口。此外,main函数中还调用了rand.Seed函数,用于初始化随机数生成器。最后,for循环允许程序一直使用Accept函数来接受 TCP 客户端的连接请求,并以 goroutine 的方式来运行handleConnection(c)函数,处理客户端的后续请求。
  net.Listen 的第一个参数
  net.Listen函数的第一个参数定义了使用的网络类型,而第二个参数定义了服务端监听的地址和端口号。第一个参数的有效值为tcp、tcp4、tcp6、udp、udp4、udp6、ip、ip4、ip6、Unix(Unix 套接字)、Unixgram和Unixpacket,其中:tcp4、udp4和ip4只接受 IPv4 地址,而tcp6、udp6和ip6只接受 IPv6 地址。
  服务端并发测试
  concTCP.go需要一个命令行参数,来指定监听的端口号。当它开始服务 TCP 客户端时,你会得到类似下面的输出:$ go run concTCP.go 8001 Serving 127.0.0.1:62554 Serving 127.0.0.1:62556
  netstat的输出可以确认congTCP.go正在为多个 TCP 客户端提供服务,并且仍在继续监听建立连接的请求:$ 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在服务多个 TCP 客户端时的输出:
  类似地,下面这张图片显示了两个 TCP 客户端的输出(使用了 nc工具):
  你可以在 维基百科上找到更多关于nc(即netcat)的信息。
  总结
  现在,你学会了如何用大约 65 行 Go 代码来开发一个生成随机数、支持并发的 TCP 服务端,这真是太棒了!如果你想要让你的 TCP 服务端执行别的任务,只需要修改 handleConnection函数即可。
  via: https://opensource.com/article/18/5/building-concurrent-tcp-server-go
  作者:Mihalis Tsoukalos选题:lkxed译者:lkxed校对:wxy
  本文由 LCTT原创编译,Linux中国荣誉推出

中国距核聚变发电还有6年?将开建全球最大脉冲驱动器,2028年发电南华早报报道了一个让人惊喜的消息,中国顶级科学家称核聚变发电距离我们只有6年的时间了,据这位科学家表示,中国政府已批准建设世界上最大的脉冲驱动器,计划在2028利用核聚变能并网发电iPhone14破发,黄牛赔惨了9月16日,iPhone14系列正式发售。首批发售的三款机型,分别是iPhone14iPhone14Pro和iPhone14ProMax,而iPhone14Plus会在10月7日发美国签证分享大家最好提前看一看Checklist(1)签证不同国家不同,对美国签证来讲,又分不同类型的签证。我是J1的签证。如果你单纯留学,不是交流学者的话,签证类型一般是F1,有些表格就不太一样,上美国大使馆台积电关闭EUV光刻机续集上演,刘德音表态,网友自相矛盾在芯片代工领域,台积电力压三星英特尔等科技巨头,其关键就在于,台积电拥有更高的良品率和产能。更高的良品率取决于技术优势,而更高的产能则取决于设备数量。众所周知,台积电拥有全球数量最夜读丨学会拒绝,别让生活太疲惫文民生周刊学会拒绝,是一种能力。有的人因为不懂拒绝,将自己拖得疲惫不堪而有的人懂得适当拒绝,则生活能够更加自在轻松。拒绝无意义的社交你是否有这样的体会有时为了合群,我们不得不去参加会说话,更要会回话,我们要熟练掌握沟通技巧,告别嘴笨伤人人生想要更好地适应这个社会,什么才是最重要的呢?那肯定是情商吧,因为情商如果很高将会直接决定你的生存,不管是在生活当中还是在工作里面,大部分的人都喜欢情商高的人做朋友。因为跟这种情情别离,别离情爱在远方江南小站,一辆绿皮列车,孤寂的停在哪里。这是辆方便山区乡民到城里的列车。每天这有一班车。早晨始发,中午就到山区县城,然后上山赶路,傍晚时分,就到三里湾村,这个高山上的村庄。当东方出人到中年沧桑不显锐气不减网上有一个热门话题人到中年是一种怎样的体验?一位作家这样描述这是最好的时代,也是最坏的时代。这是一个光明的季节,也是一个黑暗的季节。这是失望的冬天,也是希望的春天。人到中年,所谓的散文秋露文张福献图片来自网络昨夜,晴空万里,一夜无风。今晨,我早早起床,去寻觅秋露的踪影。院中残留着一洼水渍,不用问,是露水昨夜光顾了这里。地面上,如同小儿信笔涂鸦了一般,深一片,浅一片,骂你不是打不过你在我们魏家湾,很多形容词,只可意会言传,写不出来。写出来没有了那个腔调,也失去了语言的饱和度和巨大的张力。语言最丰富多彩的时候,是骂架的时候,日常几个人说话,都是过脑子,想好了在说大胸怎么搭配显瘦胸大女生必备的穿搭小技巧夏天皮肤暴露,很多女性比较苦恼,没有办法改变乳房,减肥也不能立竿见影。暴露出来的问题会越来越多,无论穿什么样的衣服,眼神都会变得更加专注。其实很多时候,是因为他们没有掌握穿衣搭配的
国庆大家去哪了?大数据告诉你来源交汇点新闻客户端交汇点讯国庆节你去哪里玩了呢?企查查发布三大园三大馆热门城市榜单,博物馆科技馆海洋馆动物园植物园游乐园排名前十的城市榜单中,广州深圳西安共上榜6次,成都合肥南京人物生涯第11个赛季终于做上了球队老大,他就是保罗乔治保罗乔治(1990年5月2日),美国男子篮球运动员,司职前锋,现效力于NBA洛杉矶快船队,绰号泡椒。乔治在球场上非常全能,进攻手段丰富防守出色,抢断能力强。保罗乔治在2010年NBSnowCone(刨冰)!Android12的甜点名称确认2021年5月19日,安卓12发布。5个月后谷歌正式将源代码推送到Android开源项目(AOSP),同时正式发布最新版本的Android12大版本更新。随着Android12(A冯巩26岁娶初恋,相爱38年,47岁被敲诈,儿子创业当老板十一期间,63岁的冯巩亮相某景区,为大家登台表演,恰逢那天下雨,冯巩全身都淋湿了。其实舞台上面有顶棚,冯巩完全可以站在里面表演,但他为了让观众看清楚,特意走到台前,和观众一起淋雨,二连胜!这才是勇士篮球你还说一场论吗?请看到最后心今天,勇士的第二场季前赛也顺利结束了,对阵有约老师的老道掘金。过程起起伏伏,中间最多落后17分,然后一直交替领先,最后一节末端还落后5分,终于艰难追上,实现逆转。虽说是美媒列出了202122赛季可能表现不佳的5支球队,湖人篮网难兄难弟球迷网友们都在猜测,休赛季那么多季后赛球队补强后,究竟谁能进入总决赛夺得总冠军。其实伤病球队气氛球星组合都是影响他们进入季后赛的关键因素。虽然有些球队的表现可能会超出预期,但也有少辽宁功勋前锋退役!32岁看淡名利,拒绝两队邀请,如今自己做老板辽宁队今年夏天进行了一系列的阵容调整工作,其中老将贺天举离队让众多球迷颇为不舍。作为一名为辽宁队征战了14个赛季的老将,贺天举的职业生涯并非一帆风顺,两次重大的伤病使得天赋满满的他肝脏也需要减负?若不想肝脏过早衰老,还需趁早做好这5件事作为人体最大的代谢和排毒器官,肝脏的重要性无需多言。但现代人在较大的工作和生活压力下,往往会不由自主地做出一些伤肝的坏事,这也是难以避免的。既如此,养肝护肝就成了一个热点话题,不少年过70想追求健康长寿,要避开这4个养生误区,免受困扰引言人在年轻的时候就会注意自己的身形以及健康状况,毕竟没有人愿意生病,也无人愿意经常往医院跑。所以当上了年纪之后就更是在意自己的健康状况,每天大把大把的吃营养品补品,让自己的身体更中药古今研究远志一典籍摘要1。神农本草经主咳逆伤中,补不足,除邪气,利九窍,益智慧,耳目聪明,不忘,强志倍力。2。饮片新参苦温辛酸。通七窍,益志健脑,安神,化痰,止咳。3。名医别录定心气,止惊悸,米兰32惊天大逆转!功臣潸然泪下我不受球迷待见,但我不想走黎明说球带大家回顾一场精彩的意甲比赛,北京时间10月17日凌晨2时45分,意甲联赛第8轮的一场比赛打响,AC米兰坐镇主场迎战来访的维罗纳队,最终米兰上演超级大逆转,以32的比分战胜