开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数。

TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务。在本文中,我将在GO编程语言,返回随机数。对于来自TCP客户端的每个传入连接,TCP服务器将启动一个新的goroutine来处理该请求。

你可以找到这个项目,concTCP.go,在GitHub上。

处理TCP连接

程序的逻辑可以在handleConnection()职能,其实现方式如下:

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()

}

如果TCP客户端发送“STOP”字符串,那么为该特定TCP客户端提供服务的goroutine将终止;否则,TCP服务器将向TCP客户端发送随机数。for循环确保TCP客户端将在TCP客户端所需的时间内得到服务。控件中的GO代码。for循环从tcp客户端逐行读取数据,使用bufio.NewReader(c).ReadString('n')并使用c.Write([]byte(string(result)))。

兼容并蓄

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

func main() {

arguments := os.Args

if 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()Call用于告诉GO程序接受网络连接,从而充当服务器。的返回值net.Listen()是net.Conn类型,它实现io.Reader和io.Writer接口。main()函数还调用rand.Seed()函数来初始化随机数生成器。最后,for循环允许程序继续接受新的tcp客户端。Accept()的实例来处理handleConnection()函数,该函数作为goroutines执行。

net.Listen()的第一个参数

的第一个参数net.Listen()函数定义将要使用的网络类型,而第二个参数定义服务器地址以及服务器将侦听的端口号。第一个参数的有效值是TCP、tcp 4(仅IPv 4-)、tcp 6(仅IPv 6)、UDP、udp 4(仅IPv 4-)、udp 6(仅IPv 6)、IP、IP4(仅IPv 4-)、ip6(仅IPv 6)、Unix(Unix套接字)、Unixgram和UnixPacket。

运行中的并发tcp服务器。

ctCP.go需要一个命令行参数,这是它要侦听的端口号。在为TCP客户端提供服务时,从ctCP.go获得的输出将类似于以下内容:

$ go run concTCP.go 8001

Serving 127.0.0.1:62554

Serving 127.0.0.1:62556

输出netstat(1)可以验证ctCP.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。前两行验证是否存在使用端口号8001和62556的已建立的tcp网络连接。类似地,第三行和第四行验证是否存在使用端口号8001和62554的另一个已建立的tcp连接。

下图显示了在为多个TCP客户端提供服务时,ctCP.go的输出:

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

类似地,下面的映像显示了两个TCP客户机的输出,它们使用nc(1)效用:

摘要

因此,您刚刚学习了如何开发一个并发TCP服务器,该服务器使用大约65行GO代码生成随机数,这是相当令人印象深刻的!如果希望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代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...

  4. nt服务器需要的协议,构建没有NT服务器的NT域

    作者:杨鹏 国内用户的中小型网络大量采用了WindowsNT作为网络操作系统(NOS),提供诸如用户管理.文件共享等基本网络服务.如果出于工作上的考虑,必须使用WindowsNT域模型来管理网络,同时 ...

  5. Web服务器群集——公有CA构建阿里云服务器HTTPS

    公有CA构建阿里云服务器HTTPS 一.准备工作 1.1 服务器购买 1.2 域名购买及解析配置 二.SSL证书申请 三.服务器配置 四.登陆浏览器测试 一.准备工作 ECS服务器 域名 DNS HT ...

  6. vista系统服务器,Vista系统中怎么设置IIS服务器

    Vista系统中怎么设置IIS服务器 发布时间:2021-07-22 17:45:04 来源:亿速云 阅读:56 作者:Leah 本篇文章给大家分享的是有关Vista系统中怎么设置IIS服务器,小编觉 ...

  7. linux下最好的ftp服务器,用Linux系统构建高效FTP服务器

    配置虚拟用户FTP 上面配置的FTP服务器有一个特点,就是FTP服务器的用户本身也是系统用户.这显然是一个安全隐患,因为这些用户不仅能够访问FTP,也能够访问其它的系统资源.如何解决这个问题呢?答案就 ...

  8. 服务器在机柜中的安装位置,服务器上机柜的安装方法

    服务器上机柜的安装方法 内容精选 换一换 安装依赖时,使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络,且提示"Could not find a version ...

  9. xp系统登录不上ftp服务器,在XP中顺利登录FTP服务器

    董师傅教你:通过系统设置解决在IE7.0中直接输入FTP地址无法登录服务器问题 最近,笔者新装了Windows XP系统,系统自带的IE版本为7.0.在IE地址栏中输入内网FTP地址,如ftp://1 ...

最新文章

  1. C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别
  2. 获取用户电脑的上网IP地址
  3. 13.QT信号槽的连接方式
  4. Shell中的case语句
  5. wsdl 与 soap协议详解
  6. 原 水质监测系统解决方案
  7. Mysql和Oracle语句区别
  8. error C3859: 超过了 PCH 的虚拟内存范围;请使用“-Zm276”或更大的命令行选项重新编译...
  9. c++ 传智课件_沪科版初中物理九年级全册第二节 科学探究:物质的比热容公开课优质课课件教案视频...
  10. 小米怎么设置语音识别权限 | 手游网游页游攻略大全
  11. 【 Redis开发与运维】第3章 读书笔记
  12. 路由器刷php,【图片】【经验分享】路由器刷DDWRT认证锐捷校园网全程实录【哈尔滨工业大学吧】_百度贴吧...
  13. OrCAD(二)功能详情与实战总结
  14. OpenNESS Release 21.03
  15. 计算机绘图中有六种方法绘圆,圆的绘制教案
  16. 解决IndentationError:unindent与任何外部缩进级别都不匹配
  17. php过滤只匹配中英文字符串
  18. 实验七 磁盘调度算法的模拟与实现
  19. java学习---类与对象
  20. python可以替代office吗_哪些办公软件可以完美替代 Microsoft Office?

热门文章

  1. Block Formatting Contexts(块级格式化上下文)
  2. JavaScript 中 substr 和 substring的区别
  3. 利用URL重写跟踪Session(多学一招)
  4. 12-Mybatis 缓存
  5. windows共享文件夹端口_探讨横向渗透背后的Windows安全机制
  6. vue4 跳转外部链接_vue跳转到外部链接
  7. Merry Christmas!看甜点海报如何庆祝圣诞
  8. 2020移动应用设计流行素材|交互动画
  9. UI设计超干货素材!小图标里的大学问!
  10. python resample函数_18_python_pandas_DataFrame使用指南(上)(1-4)