开发一个并发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客户端自动重连_深入分析TCP的keepalive和time_wait,总能发现新东西

    TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态. 一.TCP keepalive 先简单回顾一下TCP连接建立和断开的整个过程.(这里主要考虑主流程,关于丢包.拥塞 ...

  3. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

  4. go tcp连接_在Go中构建并发TCP服务器样例

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

  5. go tcp客户端自动重连_使用 Go 语言创建 WebSocket 服务

    今天介绍如何用 Go 语言创建 WebSocket 服务,文章的前两部分简要介绍了 WebSocket 协议以及用 Go 标准库如何创建 WebSocket 服务.第三部分实践环节我们使用了 gori ...

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

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

  7. python tcp实例_实现tcp的自动重连实例教程

    下面小编就为大家带来一篇golang之tcp自动重连实现方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 操作系统: CentOS 6.9_x64 go语言版本: 1 ...

  8. rabbitmq取消自动重连_rabbitmq客户端自动重连

    编程rookie, 如有错误请指出 ☞: 253065903@qq.com RabbitMQ Node.js 客户端( AMQP 0-9-1 V0.5.2 )自动重连 重启策略 开始找解决方案: 通过 ...

  9. Socket编程概念和 Socket之异步TCP客户端断线重连

    一:什么是SOCKET​​​​​​​ socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描 ...

最新文章

  1. django安装mysql驱动
  2. tab使用 TabActivity TabHost Tabspec常用方法
  3. 3GPP(3rd Generation Partnership Project)
  4. C++技巧:用kdevelop进行交叉编译的方法
  5. 第一节:Scrapy开源框架初探
  6. 解决方案:微信小程序下载文档出错downloadFile:fail url not in domain list
  7. 设计模式在项目中的应用案例_BIM案例 | BIM技术在码头项目中的创新应用
  8. ubuntu下安装teamview
  9. YOLOAir库使用(二)
  10. mov 指令用c语言写,汇编总结:mov指令
  11. [c#]使用Fleck实现简单的WebSocket含兼容低版本IE
  12. 参数估计与假设检验—拒绝域的数学证明(手写)
  13. 一张我为写植物大战僵尸外.挂而画的草稿图...
  14. python批量telnet检测IP地址的端口是否开放
  15. linux 远程挂载目录,linux开机自动挂载远程主机文件目录
  16. 【优化求解】基于蜘蛛猴算法求解单目标优化问题matlab代码
  17. PCA(主成分分析)方法的应用场景
  18. 【游戏通关】解题报告
  19. “五•一”黄金周市民旅游指南
  20. 可攻陷所有WiFi网络!KRACK 漏洞发现者回答纪实

热门文章

  1. Oracle数据库个人整理常用的表空间、用户、授权操作
  2. poi excel 导入导出
  3. webstrom中使用git
  4. C#控件的闪烁问题解决方法总结
  5. Viod Class 启动
  6. python最好用的IDE及查看源码的方法
  7. Robot Framework连接MySQL数据库
  8. spring-boot-maven-plugin 插件
  9. python 连接MYSQL数据库(入门帖)
  10. [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...