开发一个并发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.Readerio.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的输出:

TCP功能于go_server.png

concTCP.go TCP服务器正在运行。

类似地,下图显示了使用该nc(1)实用程序实现的两个TCP客户端的输出:

TCP功能于go_client.png

使用该nc(1)实用程序作为TCP客户端来concTCP.go。

你可以找到更多的信息nc(1),这也叫netcat(1),在维基百科上。

摘要

所以,您刚刚学会了如何使用大约65行Go代码开发一个生成随机数的并发TCP服务器,这非常令人印象深刻!如果您希望TCP服务器执行不同的工作,只需更改该handleConnection()功能的实现。

go tcp连接_在Go中构建并发TCP服务器样例相关推荐

  1. tcp并发服务器_在Go中构建并发TCP服务器

    tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...

  2. go tcp客户端自动重连_在Go中构建并发TCP服务器样例

    开发一个并发TCP服务器,只使用大约65行Go代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...

  3. go高性能tcp服务器,在Go中构建并发TCP服务器

    开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数. TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务.在本文中,我将在GO编程语言,返回随机数.对于来自TCP ...

  4. 闪亮蔚蓝_在R中构建第一个闪亮的Web应用

    闪亮蔚蓝 数据科学 (DATA SCIENCE) Do you want to make your R code publicly available for others to use? If yo ...

  5. keras构建卷积神经网络_在Keras中构建,加载和保存卷积神经网络

    keras构建卷积神经网络 This article is aimed at people who want to learn or review how to build a basic Convo ...

  6. 消息队列一直建立tcp连接_云架构那些事儿:为什么我的TCP连接建立异常?

    搞IT的同学无论是做开发的.做测试的.做运维的一定都遇到过以下几种报错,导致服务调用失败: connection timeout read timeout connection reset by pe ...

  7. linux命令查看tcp连接,查看linux系统中的TCP连接

    查看Linux的TCP连接 netstat -na    查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...

  8. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  9. hp 交换机远程连接_使用iLO远程管理HP系列服务器

    iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxworks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机.只要将服务 ...

最新文章

  1. tx2 numba opencv
  2. 【CodeForces - 1082B】Vova and Trophies (贪心模拟,暴力)
  3. php如何解决报错,php 启动报错如何解决_PHP教程
  4. java.lang.NoSuchFieldError: No instance field
  5. 送一个内存泄漏给 2016 的记几
  6. pytorch dropout代码解读
  7. C:矩形相交、相包含、相离关系判断
  8. 23种设计模式(十)对象创建之构建器
  9. 32bit64bit Win7系统下的IE8离线升级到IE11方法
  10. Android socketnetty实现
  11. 5S现场管理之车间现场标准化管理的六大执行要点
  12. 拔丝芋头的Java学习日记--Day2
  13. 如何确定一台电脑配置的高低
  14. Windows下使用pip时出现TSL/SSL错误解决方案
  15. 手机搜狐 html5,手机搜狐欲改版推全新域名及LOGO 着力Html5技术
  16. mysql 叶子节点_MySQL 树形结构 根据指定节点获取其所有叶子节点
  17. 把时间当作朋友 读后感
  18. 听 小城大事 大城大事 总结出来的故事(上篇)
  19. Python编程之文件操作
  20. LocalDateTime日期格式转换问题

热门文章

  1. 10外置面板没声音_现在电脑机箱只能用外置光驱了?看我装了个隐蔽式光驱
  2. swagger默认访问路径_spring-boot集成swagger-ui修改默认访问路径
  3. VUE使用过滤器来格式化当前时间
  4. 洛谷——P1426 小鱼会有危险吗
  5. es 仅返回单个字段 查询_ES性能优化实战,几十亿数据查询 3 秒返回!
  6. python测试udp端口_zabbix上使用外部检查的方式监测公网tcp/udp端口开放情况
  7. DMA(direct memory access)直接内存访问
  8. jquery 的$()
  9. cursor游标(mysql)
  10. php 脚本会超时吗,PHP脚本执行超时的解决办法