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

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

大众发布ID。3性能版小米有品众筹NAS云存储ColorOS12官宣电动狗在日前召开的慕尼黑车展上,大众发布了ID。3性能版车型,命名为大众IDX。车辆配备有专属的战斗灰和荧光绿涂装,搭配大尺寸的轻量化锻造轮毂,整车的战斗风格明显。动力部分,有透露中国6G早已领先世界,美国正疯狂追赶?任正非我们很有信心在中国智能通信领域的龙头老大华为公司一直在国际上的5G技术中处于领先地位。在我们日常生活中,5G也渐渐来临。商场上随处可见的5G手机,还有三大运营商,在中国的一线和二线城市建立了上30万级鲜有对手,没有补贴也畅销,特斯拉真的这么香?特斯拉可以说是新能源汽车领域的领头羊,虽然如今各大新晋造车势力和老牌车企都开始在新能源领域发力,争夺市场,但是特斯拉旗下的众多车型依旧保持着不菲的销量,尤其是Model3。和特斯拉想买个空调,格力和美的价格差距很大,为什么差那么多钱?我就是做空调安装维修的,格力绝对比美的好,不服不懂的可以买来拆开看看用料!一个小小的辅料包扎带都不一样!有的用户屁都不懂,就是嘴巴硬!买格力不如加几百元买三菱电工,格力除了材料用的华为麒麟芯片1299起5000毫安大电池畅享20se2020年12月23日发布的华为畅享20se销量一直不错,性价比也可以,下面来一起了解一下!手机屏幕类型为打孔屏,多点触摸,电容屏,屏幕大小为6。67英寸,手机屏幕分辨率FHD24你都拍过哪些好看的月亮照片?我没拍过,但我有几张漂亮的月亮图片,是在网上和好友那里下来的,我愿意拿出来分享心佳能相机拍摄。2018年1月31日,152年一遇的超级月亮来了。当天下午天阴的很好,所以就没打算能看AirPods可以更换电池吗?谢谢邀请,电池可以更换,需要拿去售后更换,即使拿去售后也不一定可以恢复原样,因为耳机内部结构非常紧密,并且使用了大量的胶水,这给维修带来了很大的难度,必须借助售后的专业工具进行拆解你下载国家反诈中心App了吗?一键提醒反诈骗你下载国家反诈中心App了吗?相信经常看短视频的网友对这句话并不陌生。近日,河北省秦皇岛市反诈民警陈国平(抖音ID反诈警官老陈)PK主播走红网络,幽默搞笑的同时网络上也掀起了一波反看不懂,一个猴子的头像搭上了区块链,怎么就能价值18万美金了呢看不懂,看不懂,真的看不懂,一个猴子的头像搭上了区块链,怎么就能价值18万美金了呢,什么事儿呢?那就是这只猴子那就是这只猴子,前些天,著名的NBA球星斯蒂芬库里花了18万美金,把这1。5匹空调,一级二级和三级能效一样吗?哪种省电?为什么?文章导语夏天空调会使用的频率很高,然后很多的朋友都反映家中夏天的电费相当的高,于是大部分朋友都认为这些电费都是有空调所产生的。在这篇文中,家居杂坛就想通过家庭常用的1。5匹的定频空究竟是买12,还是等13呢今天小编给你们聊一聊这个话题呀,很多小伙伴现在都在纠结这一个问题,是换12还是等13呢?小编觉得这个东西还是看大家的预算!预算充足不着急换机的情况下就先等13发布之后,购买13,着
换种结构但风格依旧,雷蛇黑寡妇X幻彩版雷蛇黑寡妇蜘蛛系列的经典在这就不用我们做过多叙述,外设市场上再难找出有如此多版本的系列键盘了,经过长期的市场积累该系列的外观早已深入人心。雷蛇并没有因为其经典而停止对此系列的更新,樱桃轴入门级机械第二弹,DuckyampampampAkko联手前的ZERO31082019年6月,DUKCY和AKKO结束了合作,包括3108在内的ZERO3系列归AKKO,DUCKY另觅蹊径开始ONE2SHINE和ZERO9系列的未完之旅。台湾外设在大陆不乏水难得一见的奇葩亚克力RGB机械键盘这款键盘来自Womier沃弥尔的K66,这是个没听过的新牌子,之前知道叫火酷的出过类似风格的机械键盘。K66一席白色(键帽)和透明亚克力(机身)的结合,给人清爽干练的感觉,重量也仅无欲则刚无钢则软,它是最像薄膜键盘的机械键盘在信息并不如现在流通网络上关于机械键盘的内容也还不是非常丰富的年代,Cherry的MX2。0是许多外设小白入坑的第一站。原因有两点,第一是亲民的售价,第二则是cherry在机械键盘哪些改变是有用的?图解达尔优牧马人5代EM915鼠标牧马人作为达尔优有乃至国产最具话题性和畅销的游戏鼠标,与达尔优对于其不断的改良和完善有非常重要的联系。从12年牧马人诞生之初至今,先后已经推出了十多个版本,灯光,体型,配色等都有不国产厂商的一次赌博,黑爵也有狗屁王黑爵也有狗屁王。这是我们在看到黑爵i305pro新闻后异口同声的一句话。这里面带这些惊讶不屑和无奈,又掺杂些轻蔑和莫名高兴,确实五味杂陈。但作为独立第三方,有色眼光的东西先放一边,高阶自动驾驶的量产车型摩卡预售17。984月19日,WEY品牌全球代言人WEY摩卡首席智能体验官姚安娜,空降上海车展智动WEY来摩卡专属日,携手全球首款智能汽车人WEY摩卡,为现场粉丝呈现了车展史上自动驾驶走秀,书写了其夜间安全行车八项注意夜间行车由于视线差车速快等原因,很容易引发交通事故,因此驾驶员要结合夜间行车实际,掌握安全行车要点,确保夜间行车安全。归纳起来夜间安全行车主要有以下8项注意。1注意保持车距。夜间行夜间安全行车八项注意夜间行车由于视线差车速快等原因,很容易引发交通事故,因此驾驶员要结合夜间行车实际,掌握安全行车要点,确保夜间行车安全。归纳起来夜间安全行车主要有以下8项注意。1注意保持车距。夜间行高阶自动驾驶的量产车型摩卡预售17。984月19日,WEY品牌全球代言人WEY摩卡首席智能体验官姚安娜,空降上海车展智动WEY来摩卡专属日,携手全球首款智能汽车人WEY摩卡,为现场粉丝呈现了车展史上自动驾驶走秀,书写了其有脑有心有力WEY摩卡预售火爆进行中4月19日,WEY品牌全球代言人WEY摩卡首席智能体验官姚安娜,空降上海车展智动WEY来摩卡专属日,携手全球首款智能汽车人WEY摩卡,为现场粉丝呈现了车展史上自动驾驶走秀,书写了其