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

在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中国荣誉推出

海评面中国航天正向世界最先进水平快速迈进10月17日9时50分,神舟十三号出差三人组成功开启货物舱舱门,并顺利进入天舟三号货运飞船。随后,航天员乘组将开始在空间站为期半年的太空出差。距离前任太空出差三人组完成任务不到一个上空爆亮!窜天猴?坠机?官方回应12日晚,有网友拍到天津上空有光亮划过天空,十分夺目!流星?UFO?13日,国家天文台兴隆观测站表示该站全天相机也拍到了这个目标!北京时间2021年10月12日18时6分许,一颗疑告别鸽王称号,詹姆斯韦伯太空望远镜即将抵达发射场耗资百亿美元的天文望远镜刚刚结束为期16天的海上航行,总计航行9300多公里,它在地球上的最后一段旅程即将结束,未来,它将在太空开展真正精彩的冒险。经过16天的航海旅行,载有詹姆斯神舟十三号载人飞船与空间站组合体完成自主快速交会对接10月16日在北京航天飞行控制中心拍摄的神舟十三号载人飞船与天和核心舱自主快速交会对接的画面。据中国载人航天工程办公室消息,神舟十三号载人飞船入轨后顺利完成入轨状态设置,于北京时间当人类消失后,地球的新主人真的是蚂蚁吗?科学家这样解释虽然作为如今地球的绝对控制者,但是人类的历史也不过区区几百万年,而且有文字的历史最多也就只有五千年,而地球已经拥有了几十亿年的历史,在这段漫长无比的岁月里,不少曾经地球的主人都消失太空上个厕所有多难?揭秘著名的阿波罗10号飞翔事件在一份1969年阿波罗10号任务的解密文件档案上,清楚记录了一段与厕所有关的重口味故事阿波罗10号是阿波罗计划中第四次载人飞行任务,也是登月前最后一次载人环月测试飞行,飞船上共有3神舟十三号上天干嘛去了?新技术机械臂辅助舱段转位有多牛?神舟十三号上天究竟是干嘛去了?有什么新技术?你知道吗?别急,现在我来帮你聊明白神舟十三号究竟都有哪些任务。咱们天宫空间站的建设,在2021年和2022年,一共规划11次发射任务,4刘姓爸爸给孩子取名真是奇葩,老师表示害羞都不敢点名我们每个人的名字都是独一无二的,更是一种身份的象征,当然也有的人认为起名字,只要是能叫上名字就可以了,并不用那么讲究。不过,现在的家长很重视孩子要起什么名字,因为很多时候都会觉得名第一次上幼儿园怎么才能不哭?数据显示哭是好事,比不哭憋着强在某问答平台上看到这样一个问题小朋友第一次进幼儿园怎样才能不哭?我的第一反应去幼儿园不哭对孩子来说也太苛刻了吧?初入一个新环境大人都要适应好久,何况只有三岁的孩子,更何况他们还是第天使曾经来过!出生仅2天的婴儿捐献双肾孕周29周,体重仅1。07kg小婴儿欢欢(化名)在父母的期盼中到来可她还没来得及看看这个世界就在出生的第二天因误吸匆匆离世但是,她留下了一份珍贵的生命礼物一对肾脏近日,欢欢的双肾被2009年第七顺位的库里已3冠在手,那前面顺位的几位成就呢?斯蒂芬库里是当今联盟最强的控球后卫,是一位划时代的超级巨星,他在三分球的造诣可以说已臻化境,33岁的他巅峰依旧,职业生涯已经拿到3次总冠军,2次常规赛MVP,2次得分王,1次抢断王
马克西应从替补打起,释放板凳活力,就看里弗斯有没有魄力费城上赛季两大顽疾,进攻篮板与板凳得分,夏天球队管理层针对性的引进了能抢进攻篮板哈雷尔,塔克这点其实同身高中也属于出色,外线添加了豪斯与梅尔顿,增加板凳活力,结果30多场下来,里弗包青天演员今昔,展昭何家劲还是单身,刘雪华已成老奶奶三口铡刀,上铡皇亲,下铡平民,至今都忘不了那句王朝马汉,狗头铡伺候。这部包青天,在90年代红遍了两岸三地,接连创下了收视神话,也因此带来了一波包青天热,少年包青天包青天探案等等多部俄罗斯载人飞船泄漏点确定,美国倒打一耙,说是联盟号的设计缺陷联盟MS22载人飞船冷却剂泄漏事件,已经过去几天时间了,而俄罗斯终于搞清楚了泄漏点,就在飞船推进舱太阳能电池板固定点附近的冷却系统散热器上,通过欧洲机械臂和加拿大2号机械臂的仔细检行走在国外的岁月20再见迪拜(TheDUBAIMALL和奥莱)前附注原谅我中文英文夹着来啊,主要是这个DUBAIMALL的准确的中文意思我不会表达,知道是超级商场,综合商业中心,吃喝玩乐都可以的地方,但不知道哪个词准确一些,只好这样了。阿尔及VueMaterialMD风格的开源UI库,用Vue开发海外应用的绝佳选择一位朋友问我用vue开发APP在谷歌商店上架,有什么简单的UI组件库,我推荐了这款,同样推荐给各位。关于VueMaterialVueMaterial是一款简单轻量级的Vue组件,组2018年镇江茅山之行我喜欢在夏天的时候出去玩,喜欢在夏天出去旅行,喜欢在夏天的时候爬山,其实我自己也说不清楚为什么,可我就是特别喜欢爬山。爬山的时候看看山上的小野花小野草,累了就一屁股坐在树下看蚂蚁爬朝鲜人的新生活,喜欢到超市购物,有人使用银行卡作为一名外国游客,在朝鲜购物的正确方式是使用人民币或美元。朝鲜的很多购物场所,只收现金,不能刷卡支付,只收现金。朝鲜的收银员喜欢崭新的货币,略有残缺的货币他们一律不收。如今到朝鲜旅首条!瑞金有了自己的玻璃栈道啦!就在这里近日,九堡镇铜钵山玻璃栈道观光平台正式启用,这标志着全市首条观光栈道落地。九堡镇铜钵山玻璃栈道位于九堡镇铜钵山海拔750米处,坐落于上山主干道旁。栈道全长40米,宽2米,最大悬空高人少景好还免费,这些宝藏户外小公园,有你去过的吗?人少景好还免费,很多小公园里也有宝藏好去处,有的适合带娃遛娃,有的拥有网红咖啡馆,有的蕴含丰厚的历史底蕴,有的还有不容易觅得的城市秘境市文化旅游局推荐了和平公园中兴公园梅园公园等,感染高峰期来临,无论有没有阳!多吃这4种食物,增强抵抗力感染高峰期来临,无论有没有阳,多吃这4种食物,增强抵抗力年底将至,因为疫情的放开,很多人会选择提前返乡。这个时候,人员流动性就会变大,一些抵抗力差的人就会很容易中招。尤其是家里有老阳了后,吃这些科学不鸡蛋豆浆搭配碳鱼虾深色蔬菜说不能辛辣,但是每道菜都离不开小米椒,是不是有点矛盾啊鱼肉根本吃不了好吗?嗓子不舒服,还吃鱼肉这些发物?松花蛋,火腿,不给小孩吃,也没什么营养。吃药的时候是不能吃鸡蛋鱼虾之类的食物