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客户端自动重连_在Go中构建并发TCP服务器样例
开发一个并发TCP服务器,只使用大约65行Go代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...
- go高性能tcp服务器,在Go中构建并发TCP服务器
开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数. TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务.在本文中,我将在GO编程语言,返回随机数.对于来自TCP ...
- 闪亮蔚蓝_在R中构建第一个闪亮的Web应用
闪亮蔚蓝 数据科学 (DATA SCIENCE) Do you want to make your R code publicly available for others to use? If yo ...
- keras构建卷积神经网络_在Keras中构建,加载和保存卷积神经网络
keras构建卷积神经网络 This article is aimed at people who want to learn or review how to build a basic Convo ...
- 消息队列一直建立tcp连接_云架构那些事儿:为什么我的TCP连接建立异常?
搞IT的同学无论是做开发的.做测试的.做运维的一定都遇到过以下几种报错,导致服务调用失败: connection timeout read timeout connection reset by pe ...
- linux命令查看tcp连接,查看linux系统中的TCP连接
查看Linux的TCP连接 netstat -na 查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- hp 交换机远程连接_使用iLO远程管理HP系列服务器
iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxworks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机.只要将服务 ...
最新文章
- tx2 numba opencv
- 【CodeForces - 1082B】Vova and Trophies (贪心模拟,暴力)
- php如何解决报错,php 启动报错如何解决_PHP教程
- java.lang.NoSuchFieldError: No instance field
- 送一个内存泄漏给 2016 的记几
- pytorch dropout代码解读
- C:矩形相交、相包含、相离关系判断
- 23种设计模式(十)对象创建之构建器
- 32bit64bit Win7系统下的IE8离线升级到IE11方法
- Android socketnetty实现
- 5S现场管理之车间现场标准化管理的六大执行要点
- 拔丝芋头的Java学习日记--Day2
- 如何确定一台电脑配置的高低
- Windows下使用pip时出现TSL/SSL错误解决方案
- 手机搜狐 html5,手机搜狐欲改版推全新域名及LOGO 着力Html5技术
- mysql 叶子节点_MySQL 树形结构 根据指定节点获取其所有叶子节点
- 把时间当作朋友 读后感
- 听 小城大事 大城大事 总结出来的故事(上篇)
- Python编程之文件操作
- LocalDateTime日期格式转换问题
热门文章
- 10外置面板没声音_现在电脑机箱只能用外置光驱了?看我装了个隐蔽式光驱
- swagger默认访问路径_spring-boot集成swagger-ui修改默认访问路径
- VUE使用过滤器来格式化当前时间
- 洛谷——P1426 小鱼会有危险吗
- es 仅返回单个字段 查询_ES性能优化实战,几十亿数据查询 3 秒返回!
- python测试udp端口_zabbix上使用外部检查的方式监测公网tcp/udp端口开放情况
- DMA(direct memory access)直接内存访问
- jquery 的$()
- cursor游标(mysql)
- php 脚本会超时吗,PHP脚本执行超时的解决办法