go高性能tcp服务器,在Go中构建并发TCP服务器
开发一个并发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服务器相关推荐
- 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代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...
- nt服务器需要的协议,构建没有NT服务器的NT域
作者:杨鹏 国内用户的中小型网络大量采用了WindowsNT作为网络操作系统(NOS),提供诸如用户管理.文件共享等基本网络服务.如果出于工作上的考虑,必须使用WindowsNT域模型来管理网络,同时 ...
- Web服务器群集——公有CA构建阿里云服务器HTTPS
公有CA构建阿里云服务器HTTPS 一.准备工作 1.1 服务器购买 1.2 域名购买及解析配置 二.SSL证书申请 三.服务器配置 四.登陆浏览器测试 一.准备工作 ECS服务器 域名 DNS HT ...
- vista系统服务器,Vista系统中怎么设置IIS服务器
Vista系统中怎么设置IIS服务器 发布时间:2021-07-22 17:45:04 来源:亿速云 阅读:56 作者:Leah 本篇文章给大家分享的是有关Vista系统中怎么设置IIS服务器,小编觉 ...
- linux下最好的ftp服务器,用Linux系统构建高效FTP服务器
配置虚拟用户FTP 上面配置的FTP服务器有一个特点,就是FTP服务器的用户本身也是系统用户.这显然是一个安全隐患,因为这些用户不仅能够访问FTP,也能够访问其它的系统资源.如何解决这个问题呢?答案就 ...
- 服务器在机柜中的安装位置,服务器上机柜的安装方法
服务器上机柜的安装方法 内容精选 换一换 安装依赖时,使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络,且提示"Could not find a version ...
- xp系统登录不上ftp服务器,在XP中顺利登录FTP服务器
董师傅教你:通过系统设置解决在IE7.0中直接输入FTP地址无法登录服务器问题 最近,笔者新装了Windows XP系统,系统自带的IE版本为7.0.在IE地址栏中输入内网FTP地址,如ftp://1 ...
最新文章
- C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别
- 获取用户电脑的上网IP地址
- 13.QT信号槽的连接方式
- Shell中的case语句
- wsdl 与 soap协议详解
- 原 水质监测系统解决方案
- Mysql和Oracle语句区别
- error C3859: 超过了 PCH 的虚拟内存范围;请使用“-Zm276”或更大的命令行选项重新编译...
- c++ 传智课件_沪科版初中物理九年级全册第二节 科学探究:物质的比热容公开课优质课课件教案视频...
- 小米怎么设置语音识别权限 | 手游网游页游攻略大全
- 【 Redis开发与运维】第3章 读书笔记
- 路由器刷php,【图片】【经验分享】路由器刷DDWRT认证锐捷校园网全程实录【哈尔滨工业大学吧】_百度贴吧...
- OrCAD(二)功能详情与实战总结
- OpenNESS Release 21.03
- 计算机绘图中有六种方法绘圆,圆的绘制教案
- 解决IndentationError:unindent与任何外部缩进级别都不匹配
- php过滤只匹配中英文字符串
- 实验七 磁盘调度算法的模拟与实现
- java学习---类与对象
- python可以替代office吗_哪些办公软件可以完美替代 Microsoft Office?
热门文章
- Block Formatting Contexts(块级格式化上下文)
- JavaScript 中 substr 和 substring的区别
- 利用URL重写跟踪Session(多学一招)
- 12-Mybatis 缓存
- windows共享文件夹端口_探讨横向渗透背后的Windows安全机制
- vue4 跳转外部链接_vue跳转到外部链接
- Merry Christmas!看甜点海报如何庆祝圣诞
- 2020移动应用设计流行素材|交互动画
- UI设计超干货素材!小图标里的大学问!
- python resample函数_18_python_pandas_DataFrame使用指南(上)(1-4)