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

图片来源于网络

其本质就是就是编程接口(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语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号/头条:Go语言之美,更多go语言知识信息等)。公众号会持续为大家分享更多干货。

go net.conn读取请求头信息_go语言网络编程socket sever的实现相关推荐

  1. Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之14.Servlet请求头信息

    –典型的请求头信息 –读取HTTP请求头 –使用表格显示所有请求头信息 –理解各种请求头的含义 –区分不同的浏览器类型 ##############Michael分割线################ ...

  2. php 设置http 请求头信息,php设置http头

    朋友忽然提了个问题,说自己模拟请求发送的时候和在浏览器中直接访问返回的字符串不一样,我猜应该是http头的问题,在浏览器中复制出来请求头信息,模拟和浏览器请求头一样的信息发送过去,问题解决. $hea ...

  3. 通过severlet获取请求头信息

    为什么80%的码农都做不了架构师?>>>    Accept-Charset:浏览器可接受的字符集. Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip. ...

  4. openresty获取nginx请求头信息

    vi test.lua:在nginx.conf配置文件中已经指定了lua脚本了 获取到请求头信息可以帮助我们做什么呢? ①比如对同一请求url,实际上也可以认定为是同一请求用户,可以限定其单位时间内的 ...

  5. SpringMVC的请求-获得请求参数-获得请求头信息

    使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name) @RequestHeader注解的属性如下: value:请求头的名称 req ...

  6. python token发送请求_python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息...

    python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息 登录接口代码: 在这里插入图片描述 登陆后返回的结果是: 在这里插入图片描述 新增渠道接口: 新增渠道接口需 ...

  7. firefox伪造请求头信息,模拟手机访问网站

    大概有两年没有去过chinaz的论坛了,昨天上去逛了逛.正好看到一个朋友在问百度是如何判断是不是手机登录的.有几个热心朋友回答的是js,我把百度首页的js看了下,没有找到一丝的手持设备判断的信息,我也 ...

  8. php设置http请求头信息和响应头信息

    php设置http请求头信息和响应头信息 设置请求服务器的头信息可以用fsockopen,curl组件,header函数只能用来设置客户端响应的头信息,不能设置服务器的头信息. 例子; 一.heade ...

  9. restTemplate请求设置请求头信息

    //设置请求头信息 HttpHeaders httpHeaders=new HttpHeaders(); //发送请求头格式 为json/编码为utf-8 httpHeaders.setContent ...

最新文章

  1. linux i2c核心,总线与设备驱动,Linux2.6.37 I2C驱动框架分析(一)
  2. 最新!2022中国大学校友会排名发布
  3. shell for循环案例:自动批量添加iptables应用端口规则
  4. python if name main 的作用_Python----基础之if __name__ == 'main': 的作用和原理
  5. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(开发环境介绍)
  6. Linux的概念与体系 6. Linux文本流(转载)
  7. c语言课本引言课后答案,C语言基础(01-引言及预备知识)作业题
  8. python自动登录qq空间_python 利用splinter组件,自动登录QQ空间
  9. 解决Vue项目报错:Expected indentation of 2 spaces but found 4. eslint(indent) [8, 1]的方法
  10. easypr4android,车牌识别系统EasyPR的批量识别功能测试界面
  11. mysql读写分离延迟问题_MySQL读写分离后的延迟解决方案
  12. mysql关系范式试题_数据库范式练习题
  13. macbook黑屏_Mac Book电脑黑屏开不了机三种解决方法
  14. 如何通过 6 个简单步骤在百度上看到您的网站
  15. L. Lifeguards(排序)
  16. 树莓派diy小型计算机,自制树莓派电脑,让树莓派不再神秘
  17. 基于C++和OpenGL (GLUT) 实现太阳系行星系统
  18. [附源码]Java计算机毕业设计SSM东北鹿产品售卖网站
  19. 美食推荐网站系统springboot+jsp
  20. gnome显示桌面图标_gnome tweak tool 不显示桌面图标,为什么

热门文章

  1. StereoDRNet:基于stereo的三维重建网络
  2. java程序无法连接redis 正常启动但是无法访问
  3. Drug Discovery Today | 频繁命中化合物机制探究:PAINS规则的局限性
  4. 绘制三维散点图_质量工具--之散点图
  5. 天昊生物16S扩增子绝对定量测序项目文章再次登陆《Science of the Total Environment》...
  6. Science:微生物组“淘金热”,从人体中发现新型抗菌剂
  7. 美国辛辛那堤儿童医学中心招生物信息博士, 博士后和访问学者——单细胞转录组和表观方向...
  8. ANCOM:找出微生物群落中的差异物种
  9. 钻进眼球的致盲寄生虫威胁近亿人,却只是生存竞争的失败者
  10. 南京大学计算机2010年本科录取名单,2010高考本科录取名单