开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数。
TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务。在本文中,我将在GO编程语言,返回随机数。对于来自TCP客户端的每个传入连接,TCP服务器将启动一个新的goroutine来处理该请求。
你可以找到这个项目,concTCP.go,在GitHub上。
处理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() }
如果TCP客户端发送“STOP”字符串,那么为该特定TCP客户端提供服务的goroutine将终止;否则,TCP服务器将向TCP客户端发送随机数。for循环确保TCP客户端将在TCP客户端所需的时间内得到服务。控件中的GO代码。for循环从tcp客户端逐行读取数据,使用bufio.NewReader(c).ReadString('\n')并使用c.Write([]byte(string(result)))。
兼容并蓄
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()Call用于告诉GO程序接受网络连接,从而充当服务器。的返回值net.Listen()是net.Conn类型,它实现io.Reader和io.Writer接口。main()函数还调用rand.Seed()函数来初始化随机数生成器。最后,for循环允许程序继续接受新的tcp客户端。Accept()的实例来处理handleConnection()函数,该函数作为goroutines执行。
net.Listen()的第一个参数
的第一个参数net.Listen()函数定义将要使用的网络类型,而第二个参数定义服务器地址以及服务器将侦听的端口号。第一个参数的有效值是TCP、tcp 4(仅IPv 4-)、tcp 6(仅IPv 6)、UDP、udp 4(仅IPv 4-)、udp 6(仅IPv 6)、IP、IP4(仅IPv 4-)、ip6(仅IPv 6)、Unix(Unix套接字)、Unixgram和UnixPacket。
运行中的并发tcp服务器。
ctCP.go需要一个命令行参数,这是它要侦听的端口号。在为TCP客户端提供服务时,从ctCP.go获得的输出将类似于以下内容:
$ go run concTCP.go 8001 Serving 127.0.0.1:62554 Serving 127.0.0.1:62556
输出netstat(1)可以验证ctCP.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。前两行验证是否存在使用端口号8001和62556的已建立的tcp网络连接。类似地,第三行和第四行验证是否存在使用端口号8001和62554的另一个已建立的tcp连接。
下图显示了在为多个TCP客户端提供服务时,ctCP.go的输出:
ctCP.go TCP服务器正在运行。
类似地,下面的映像显示了两个TCP客户机的输出,它们使用nc(1)效用:
摘要
因此,您刚刚学习了如何开发一个并发TCP服务器,该服务器使用大约65行GO代码生成随机数,这是相当令人印象深刻的!如果希望TCP服务器执行不同的任务,只需更改handleConnection()功能。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]