go tcp客户端自动重连_在Go中构建并发TCP服务器样例
开发一个并发TCP服务器,只使用大约65行Go代码生成随机数。
本文是Mihalis Tsoukalos的Go系列的一部分。阅读第1部分:在Go中创建随机安全密码。
TCP和UDP服务器无处不在,通过TCP / IP网络为网络客户端提供服务。在本文中,我将解释如何使用Go编程语言开发一个返回随机数的并发TCP服务器。对于来自TCP客户端的每个传入连接,TCP服务器将启动一个新的goroutine来处理该请求。
你可以在GitHub上找到这个项目,concTCP.go。
处理TCP连接
该程序的逻辑可以在handleConnection()
函数的Go代码中找到,其实现如下:
func handleConnection(c net.Conn) {fmt.Printf("Serving %sn", 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()
}
编程和开发
- 新的Python内容
- 我们最新的JavaScript文章
- 最近的Perl帖子
- 红帽开发者博客
如果TCP客户端发送“STOP”字符串,则服务该特定TCP客户端的goroutine将终止;否则,TCP服务器会将随机数发送回TCP客户端。for
只要TCP客户端需要,循环就确保TCP客户端将被服务。for
循环中的Go代码逐行读取来自TCP客户端的数据,使用bufio.NewReader(c).ReadString('n')
并使用发回数据c.Write([]byte(string(result)))
。(您可能会发现净标准Go包文档很有帮助。)
并发
该main()
函数的实现告诉TCP服务器每次必须为TCP客户端提供服务时都要启动一个新的goroutine:
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()
确保程序至少有一个命令行参数。请注意,现有代码不会检查给定的命令行参数是否是有效的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.Listen()
是net.Conn
类型,它实现了io.Reader
和io.Writer
接口。该main()
函数还调用该rand.Seed()
函数以初始化随机数生成器。最后,for
循环允许程序继续使用Accept()
将由handleConnection()
函数实例处理的新TCP客户端,这些实例作为goroutines执行。
net.Listen()的第一个参数
net.Listen()
函数的第一个参数定义将使用的网络类型,而第二个参数定义服务器地址以及服务器将侦听的端口号。第一个参数的有效值为tcp,tcp4(仅限IPv4),tcp6(仅限IPv6),udp,udp4(仅限IPv4),udp6(仅限IPv6),ip,ip4(仅限IPv4),ip6(仅限IPv6),Unix(Unix套接字),Unixgram和Unixpacket。
并发TCP服务器正在运行
concTCP.go需要一个命令行参数,它是它将侦听的端口号。在为TCP客户端提供服务时,您将从concTCP.go获得的输出类似于以下内容:
$ go run concTCP.go 8001
Serving 127.0.0.1:62554
Serving 127.0.0.1:62556
输出netstat(1)
可以验证concTCP.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和62554的另一个已建立的TCP连接。
此图显示了为多个TCP客户端提供服务时concTCP.go的输出:
concTCP.go TCP服务器正在运行。
类似地,下图显示了使用该nc(1)
实用程序实现的两个TCP客户端的输出:
使用该nc(1)
实用程序作为TCP客户端来concTCP.go。
你可以找到更多的信息nc(1)
,这也叫netcat(1)
,在维基百科上。
摘要
所以,您刚刚学会了如何使用大约65行Go代码开发一个生成随机数的并发TCP服务器,这非常令人印象深刻!如果您希望TCP服务器执行不同的工作,只需更改该handleConnection()
功能的实现。
go tcp客户端自动重连_在Go中构建并发TCP服务器样例相关推荐
- tcp并发服务器_在Go中构建并发TCP服务器
tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...
- go tcp客户端自动重连_深入分析TCP的keepalive和time_wait,总能发现新东西
TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态. 一.TCP keepalive 先简单回顾一下TCP连接建立和断开的整个过程.(这里主要考虑主流程,关于丢包.拥塞 ...
- go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...
- go tcp连接_在Go中构建并发TCP服务器样例
开发一个并发TCP服务器,只使用大约65行Go代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...
- go tcp客户端自动重连_使用 Go 语言创建 WebSocket 服务
今天介绍如何用 Go 语言创建 WebSocket 服务,文章的前两部分简要介绍了 WebSocket 协议以及用 Go 标准库如何创建 WebSocket 服务.第三部分实践环节我们使用了 gori ...
- go高性能tcp服务器,在Go中构建并发TCP服务器
开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数. TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务.在本文中,我将在GO编程语言,返回随机数.对于来自TCP ...
- python tcp实例_实现tcp的自动重连实例教程
下面小编就为大家带来一篇golang之tcp自动重连实现方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 操作系统: CentOS 6.9_x64 go语言版本: 1 ...
- rabbitmq取消自动重连_rabbitmq客户端自动重连
编程rookie, 如有错误请指出 ☞: 253065903@qq.com RabbitMQ Node.js 客户端( AMQP 0-9-1 V0.5.2 )自动重连 重启策略 开始找解决方案: 通过 ...
- Socket编程概念和 Socket之异步TCP客户端断线重连
一:什么是SOCKET socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描 ...
最新文章
- django安装mysql驱动
- tab使用 TabActivity TabHost Tabspec常用方法
- 3GPP(3rd Generation Partnership Project)
- C++技巧:用kdevelop进行交叉编译的方法
- 第一节:Scrapy开源框架初探
- 解决方案:微信小程序下载文档出错downloadFile:fail url not in domain list
- 设计模式在项目中的应用案例_BIM案例 | BIM技术在码头项目中的创新应用
- ubuntu下安装teamview
- YOLOAir库使用(二)
- mov 指令用c语言写,汇编总结:mov指令
- [c#]使用Fleck实现简单的WebSocket含兼容低版本IE
- 参数估计与假设检验—拒绝域的数学证明(手写)
- 一张我为写植物大战僵尸外.挂而画的草稿图...
- python批量telnet检测IP地址的端口是否开放
- linux 远程挂载目录,linux开机自动挂载远程主机文件目录
- 【优化求解】基于蜘蛛猴算法求解单目标优化问题matlab代码
- PCA(主成分分析)方法的应用场景
- 【游戏通关】解题报告
- “五•一”黄金周市民旅游指南
- 可攻陷所有WiFi网络!KRACK 漏洞发现者回答纪实