在前面我们简单的了解了一下,如何构建客户端请求,同时简单的了解了他们之间的调用和封装关系。从而在封装方法在满足不了需求时,我们可以使用更底层一级的方法构建自己的需求。

今天我们看一下服务端的一些监听方法,在go中监听方法大致有

http.ListenAndServeTLS()

http.ListenAndServe()

net.Listen()

net.ListenPacket()

net.ListenTcp()

net.ListenUnix()

net.ListenUdp()

net.ListenIp()

net.ListenUnixgram()

net.ListenMulticastUDP()

让我们通过一张图来看看他们之间的关系:

由图可以看出,http的监听是对net.Listen()的封装,而net.Listen()是对Tcp和Unix的封装。而http的监听传入的都是tcp。所有http的监听最终都是实现的net.ListenTcp()。

其中 net.ListenTcp,net.ListenUdp(),net.ListenIP() 最终走的都是 internetSocket ()。

下面先让我们看一段代码:

func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListener, error) {fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)if err != nil {return nil, err}return &TCPListener{fd}, nil
}func (sd *sysDialer) doDialTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {fd, err := internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, 0, "dial", sd.Dialer.Control)for i := 0; i < 2 && (laddr == nil || laddr.Port == 0) && (selfConnect(fd, err) || spuriousENOTAVAIL(err)); i++ {if err == nil {fd.Close()}fd, err = internetSocket(ctx, sd.network, laddr, raddr, syscall.SOCK_STREAM, 0, "dial", sd.Dialer.Control)}if err != nil {return nil, err}return newTCPConn(fd), nil
}

通过代码对比,调用internetSocket只是传入了不同的识别符 dial和listen 。同时tcp的dial和listen在逻辑上也有些不同,但是如果你去看udp的dial和listen会发现他们的逻辑完全一样。

说了这么多废话后,让我们看看如何实现一个服务端,首先是我们最常用的http服务:

http.ListenAndServe(),go的web服务构建很简单只需要构建监听路由,然后调用监听传入端口就可以了 :

    http.HandleFunc("/", HelloServer)err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("ListenAndServe: ", err)}

http.ListenAndServeTLS和ListenAndServe基本相同,只是需要多传入2个钥匙:

http.HandleFunc("/", handler)http.ListenAndServeTLS(":8081", "server.crt","server.key", nil)

对于net.Listen处理起来就要比http的麻烦点,他需要你手动处理客户端请求和实现服务:

func chkError(err error) {if err != nil {log.Fatal(err);}
}//单独处理客户端的请求
func clientHandle(conn net.Conn) {defer conn.Close();conn.Write([]byte("hello " + time.Now().String()));
}func main() {//创建一个TCP服务端tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");chkError(err);//监听端口tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);chkError(err2);//死循环的处理客户端请求for {//等待客户的连接conn, err3 := tcplisten.Accept();//如果有错误直接跳过if err3 != nil {continue;}//通过goroutine来处理用户的请求go clientHandle(conn);}
}

net包 listen - golang相关推荐

  1. log包在Golang语言的标准库中是怎么使用的?

    Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...

  2. 导入gust包体验Golang的声明式编程

    开发者:https://github.com/andeya 作者:https://github.com/GpigZ 地址:https://github.com/andeya/gust gust基本介绍 ...

  3. net包 dial - golang

    最近一直和硬件打交道,而和这些硬件交互很多用到了socket.于是在使用的过程中同时简单的学习了一下net包的dial. 在go中,大致提供了5种dial,包括: 1.  Dial(network, ...

  4. 简单阅读golang的net/http包和Negroni的源码

    在没文档指导下阅读源码比较麻烦. 我们知道,golang比起c/c++来说,已经内建了http服务的功能,而且因为golang的特性,性能不低. 下面通过阅读net/http的部分源码来看看它是怎么工 ...

  5. Golang 包的定义、引入和工程管理

    代码结构的编排是一门编程语言的基础,本文专门谈谈 Golang 包的定义.引入和工程管理,搞清楚 Golang 各个包之间是如何定义和引入的. 包的基本概念 在实际开发中,随着代码量越来越大功能越来越 ...

  6. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  7. 下载 golang.org/x 包出错不用代理的解决办法

    原文链接:https://www.jianshu.com/p/6fe61053c8aa?utm_campaign=maleskine&utm_content=note&utm_medi ...

  8. Golang sort 包使用

    1.sort包简介 Golang 中的标准库 sort 包为切片及用户定义的集合的排序操作提供了原语.sort包提供了对内置类型切片的排序支持,如 []int切片.[]float64切片和[]stri ...

  9. golang解决TCP粘包问题

    6行代码解决golang TCP粘包 转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用gola ...

最新文章

  1. beautifulsoup关于标签的初学习
  2. 1.6 开发集和测试集的大小-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. yii2 layout main.php,yii2 – 如何将参数传递给mainLayoutAsset.php文件?
  4. boost::hana::at_c用法的测试程序
  5. 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?...
  6. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ
  7. django链接数据库报错Error loading MySQLdb module:No module named MySQLdb
  8. 骁龙865确定:年底发布 支持5G!
  9. iOS 设计中 网络请求之 同步请求(json 请求--新方法和老方法)
  10. 层层递进——宽度优先搜索(BFS)
  11. Ubnutu_vim配置YouCompleteMe
  12. 倒立摆 adams matlab,基于adams和matlab的一级倒立摆联合仿真
  13. 【原】YUI3:js加载过程及时序问题
  14. Linux系统各发行版镜像下载(借阅)
  15. python中as是什么意思_python中with python中with as 是什么意思刚入门求解释!!!
  16. 理解offset in Python
  17. python爬取B站动态的评论总数(不含用户评论内容详情)
  18. 跨语言rpc框架Thrift
  19. java开发平时看什么东西
  20. 正则表达式语法及常用实例

热门文章

  1. 川崎机器人 K-ROSET 仿真软件插件开发
  2. qmail服务器维护
  3. python修炼之pip基本命令
  4. PMP除了应征PM职位外哪些职位可能会用到呢?
  5. 电子学报 计算机科学,电子学报
  6. 《ybtoj高效进阶》第五部分第六章例题3 耗费体力
  7. Unity中国象棋(一)——初始化棋子
  8. 软件项目生命周期模型
  9. 数据分析之淘宝数据简介
  10. vue + 微信获取用户信息