在Go中构建并发TCP服务器

TCP和UDP服务器无处不在,通过TCP / IP网络为网络客户端提供服务。在本文中,我将解释如何使用Go编程语言开发并发TCP服务器,该服务器返回随机数。对于来自TCP客户端的每个传入连接,TCP服务器将启动一个新的goroutine来处理该请求。

处理TCP连接

程序的逻辑可以在handleConnection()函数的Go代码中找到,该代码的实现如下:

如果TCP客户端发送“ STOP”字符串,则为该特定TCP客户端提供服务的goroutine将终止;否则,它将终止。否则,TCP服务器将随机数发送回TCP客户端。该for循环确保TCP客户端的服务时间与TCP客户端所需的时间一样长。for循环中的Go代码使用逐行从TCP客户端读取数据,bufio.NewReader(c).ReadString('')并使用发送回数据c.Write([]byte(string(result)))。(您可能会发现网络标准Go软件包文档很有帮助。)

并发

该main()函数的实现告诉TCP服务器每次必须为TCP客户端提供服务时都要启动一个新的goroutine:

首先,请main()确保该程序至少有一个命令行参数。请注意,现有代码不会检查给定的命令行参数是否为有效的TCP端口号。但是,如果给定的值不是有效的TCP端口号,则对的调用net.Listen()将失败,并显示类似于以下内容的错误消息:

该net.Listen()调用用于告诉Go程序接受网络连接,从而充当服务器。的返回值net.Listen()是的net.Conn类型,它实现了io.Reader与io.Writer接口。该main()函数还调用该rand.Seed()函数以初始化随机数生成器。最后,该for循环允许程序继续使用Accept()将由handleConnection()函数实例执行的新TCP客户端,该实例将作为goroutine执行。

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获得的输出与以下内容类似:

输出netstat(1)可以验证concTCP.go在侦听更多连接时是否服务于多个TCP客户端:

前面命令输出的最后一行告诉我们,有一个进程正在侦听端口8001,这意味着您仍然可以连接到TCP端口8001。前两行验证存在已建立的TCP网络连接使用端口号8001和62556。类似地,第三和第四行验证是否存在另一个使用端口号8001和62554的已建立TCP连接。

此图显示了服务多个TCP客户端时concTCP.go的输出:

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

总结

因此,您刚刚学习了如何开发并发TCP服务器,该服务器使用大约65行Go代码生成随机数,这真是令人印象深刻!如果您希望TCP服务器执行其他工作,只需更改handleConnection()功能的实现即可。您可以在GitHub上找到这个项目concTCP.go{https://github.com/mactsouk/opensource.com}。

启动go服务_使用Go构建TCP并发服务器,这种方式原来这么简单相关推荐

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

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

  2. RHEL4- DNS服务(六)构建DNS缓存服务器

    RHEL4- DNS服务(六)构建DNS缓存服务器   如果要构建DNS缓存服务器其实不是很复杂,只要安装一个系统自带的软件包即可.其实这个软件包,我们在<RHEL4- DNS服务(一)bind ...

  3. Linux网络编程——tcp并发服务器(多线程)

    https://blog.csdn.net/lianghe_work/article/details/46504243 tcp多线程并发服务器 多线程服务器是对多进程服务器的改进,由于多进程服务器在创 ...

  4. Linux网络编程——tcp并发服务器(多进程)

    https://blog.csdn.net/lianghe_work/article/details/46503895 一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多 ...

  5. weblogic 正在启动 wsee服务_详解LINUX安装部署weblogic集群--第二部分

    概述 续一下前几天说的安装部署weblogic集群部分,前面介绍了在每台服务器(ABCDE)安装weblogic软件,下面只在A服务器创建域,最后再拷贝到其他服务器即可. 使用Domain Confi ...

  6. linux 启动rsyslog服务_我的服务器怎么老这么慢,难道说是被挖矿了?linux开机启动项自查...

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题! 作者丨小熊爱编程 来源丨编程三分钟(coding3min) &quo ...

  7. 在Linux下如何启动MySQL服务_怎样在linux下启动mysql服务-linux下启动mysql服务的方法 - 河东软件园...

    近几日有用户在向小编询问,在linux系统下安装了Mysql数据库,软件是顺利安装了,可是不知道如何进行Mysql的相关配置才能使mysql服务的相关启动及停止操作.Mysql是目前比较流行的数据库了 ...

  8. java启动mysq服务_启动java服务器

    Servlet Servlet担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层. Servlet是位于Web 服务器内部的服务器端的Java ...

  9. 1 linux下tcp并发服务器的几种设计的模式套路,Linux下几种并发服务器的实现模式(详解)...

    1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循 ...

最新文章

  1. 最优非对称加密填充(OAEP)
  2. Python性能优化的20条建议
  3. JS转字符 判断数字等
  4. pipeline 流水线设计
  5. mysql的查表语句_mysql查表语句_MySQL
  6. ruby hash方法_Ruby中带有示例的Hash.default(key = nil)方法
  7. 图的绝对中心(bzoj 2180: 最小直径生成树)
  8. 报表性能优化方案之行引擎执行层式报表
  9. 联想服务器装系统按,联想服务器装系统的流程
  10. STAMP:Short-TermAttention/MemoryPriorityModelfor Session-basedRecommendation
  11. 数据结构:八大数据结构分类
  12. 常用机器视觉软件介绍
  13. Gamma.app:由AI驱动,一种呈现想法的新媒介
  14. 游戏服务器里怎么看在线人数,数据大佬统计服务器在线人数 来看看哪区最鬼...
  15. 电脑突然复制粘贴不了
  16. 计算机论文专著 论文集,学习计算机方面论文参考文献 学习计算机专著类参考文献有哪些...
  17. [附源码]java毕业设计房屋租赁管理系统
  18. tomcat 日志报错 java.lang.UnsupportedClassVersionError: com/wlt/controller/IndexController
  19. 微软在2022年Gartner云计算AI开发者服务魔力象限中被评为“领导者”
  20. 生成模型——自回归模型详解与PixelCNN构建

热门文章

  1. weblogic服务器上类或者方法找不到的解决办法
  2. Handshake failed due to invalid Upgrade header: null 解决方案
  3. 混沌思维模型实战课课件分享
  4. 【免费下载】2021年11月热门报告盘点(附热门报告列表及下载链接)
  5. Mahout的一些推荐算法
  6. 【岗位详情】腾讯广告策略产品经理(北京)
  7. 谷歌 ICLR 2020 | 向量化召回也需要『预训练』
  8. n1怎么进入线刷模式_怎么用斐讯NI天天链刷机成电视机顶盒教程
  9. linux cacti 搭建,linux下搭建cacti监控(示例代码)
  10. c语言玫瑰花图形程序,一个玫瑰花的程序