您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

go语言网络编程之socket sever的实现

时间:2019-07-01 11:11:48  来源:  作者:

首先说一下socket,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket(百度百科)。

go语言网络编程之socket sever的实现

图片来源于网络

其本质就是就是编程接口(API),对TCP、UDP的封装。使用时我们可以指定使用的协议,今天主要使用TCP,目前我们大多数使用的还是TCP,虽然速度没有UDP快,但是更安全,如果有能力的同学,可以使用UDP同时在上层能够检测到传输数据是否有丢失,这个不是很简单做到的。今天就以TCP为例,说一下Go语言实现一个简单的sever。

go语言的网络编程主要是net包,我们使用:

func Listen(network, address string) (Listener, error)

这个接口来监听我们的端口,并且指定协议。这里会返回一个Listener对象,就是一个接口,其中实现了三个方法:Accept(),Close(),Addr()。其中Accept返回一个Conn对象,这个就是我们最终需要的,这里面包括了请求数据。看一下简单的代码实现:

func main() {
 addr := "0.0.0.0:8080"
 listener, err := net.Listen("tcp", addr)
 if err != nil {
 panic(err)
 }
 defer listener.Close()
 for {
 conn, err := listener.Accept()
 if err != nil {
 break
 }
 go handleReq(conn) // 启用一个协程处理请求
 }
}
func handleReq(conn net.Conn) {
 // todo
}

上面的代码实现了对本地8080端口的监听,每当有一个请求过来时,我们单独一个协程来处理这个请求,这样不至于一个请求阻塞在这里。

接下来我们就是对请求的处理,在看handleReq方法的具体实现:

func handleReq(conn net.Conn) {
 defer conn.Close()
 data := make([]byte, 1024)
 _, err := conn.Read(data)
 if err != nil {
 panic(err)
 }
 // 获取收到的数据后,存到 data 中,根据实际需求做处理。
 fmt.Println(string(data))
 // 处理之后,我们将需要的信息返回给客户端。
 res := "收到了你的请求"
 _, err = conn.Write([]byte(res))
 if err != nil {
 panic(err)
 }
}

在方法中我们接收一个conn,就是与客户端的连接,我们可以想象成sever与client的连接有一个管道,我们在管道中传输数据,而这个conn对象就是这个管道,我们先从这个管道中读取客户端发来的数据,接着根据业务需求来正确的处理,例如这个请求可能是一个用户登录的请求,我们发来的数据就是用户输入的用户名和密码等信息,在我们知道这是一个用户登录的请求时,就知道接下来该怎么做了。

那么我们如何知道这个是用户登录的请求呢?这时我们就可以通过一个规定,传过来的数据可以是一个strct,其中一个字段是Type,我们可以根据这个Type来知道这到底是一个什么请求,然后在对请求数据做处理。比如,查询一下这个用户名是否存在,密码是否正确等,然后将对应信息返回即可。这时,我们通过这根管道已经发送完数据,将管道关闭就可以了:

defer conn.Close()

建议大家多用defer,go语言提供这个很大程度的方便了写代码。

至此我们sever的简单实例就完成了,我们回头再看,我们先是使用for循环,不断的接收客户端的请求,每当有一个请求,我们创建一个协程来处理,这样我们就可以不断的接收请求,只需要将于客户端连接的管道给一个协程就好了。

这是最简单的sever的实现,但是我们在项目中,其实可以对其封装,多利用go的并发特性,使用channel来通信,例如,我们可以将sever封装成一个对象,sever监听开始时,创建一个协程来等待客户端的接口,同时创建一个协程读取请求数据,还可以创建一个协程来对每个请求数据单独处理等,多个协程工作效率会更好的,对并发很高时还是很有效的。

go语言网络编程之socket sever的实现


Tags:go   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  Tags: go  点击:(7)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  Tags: go  点击:(5)  评论:(0)  加入收藏
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Tags: go  点击:(13)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  Tags: go  点击:(21)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Tags: go  点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  Tags: go  点击:(29)  评论:(0)  加入收藏
前几节课我们学习了Django加载网页数据的相关知识,今天我们讲一下怎么加载静态文件,我们以加载图片为例,学习怎么配置静态文件。 1.思路讲解 首先我们需要新建文件(test2)作为我...【详细内容】
2021-11-23  Tags: go  点击:(43)  评论:(0)  加入收藏
在本教程中,我们将介绍如何使用 Django 发送电子邮件。我们将介绍如何配置 Django SMTP 连接,如何为您的电子邮件提供商设置应用程序密码,以及如何通过 Django shell 发送电子...【详细内容】
2021-11-10  Tags: go  点击:(22)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  Tags: go  点击:(41)  评论:(0)  加入收藏
谷歌宣布调整服务费费率,从明年起Google Play上所有付费订阅的抽成将从30%降低到15%。此外,电子书和点播音乐流媒体服务还将有资格享受低至10%的费率。此前,Google Play上的开...【详细内容】
2021-10-28  Tags: go  点击:(38)  评论:(0)  加入收藏
▌简易百科推荐
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Go语言中文网    Tags:Go语言   点击:(13)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Go语言中文网    Tags:slices 包   点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  crossoverJie    Tags:Go   点击:(29)  评论:(0)  加入收藏
go-micro是基于 Go 语言用于开发的微服务的 RPC 框架,主要功能如下:服务发现,负载均衡 ,消息编码,请求/响应,Async Messaging,可插拔接口,最后这个功能牛p安装步骤安装proto...【详细内容】
2021-09-06    石老师小跟班  Tags:go-micro   点击:(197)  评论:(0)  加入收藏
GoLand 2021.2 EAP 5 现已发布。用户可以从工具箱应用程序中获得 EAP 构建,也可以从官方网站手动下载。并且从此 EAP 开始,只有拥有有效的 JetBrains 帐户才能加入该计划。手...【详细内容】
2021-06-29  IT实战联盟  今日头条  Tags:GoLand   点击:(185)  评论:(0)  加入收藏
作者:HDT3213今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器。支持: 5 种数据结构(string、list、hash、set、sortedset) 自动过期(TTL) 发布订阅、地理位...【详细内容】
2021-06-18  HelloGitHub  今日头条  Tags:Go   点击:(125)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  1024课堂    Tags:Go语言   点击:(232)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  HelloGo  今日头条  Tags:Go语言   点击:(223)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:Go语言   点击:(236)  评论:(0)  加入收藏
1.简介channel是Go语言的一大特性,基于channel有很多值得探讨的问题,如 channel为什么是并发安全的? 同步通道和异步通道有啥区别? 通道为何会阻塞协程? 使用通道导致阻塞的协程...【详细内容】
2021-05-10  程序员麻辣烫  今日头条  Tags:Go通道   点击:(274)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条