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

今天我们看一下服务端的一些监听方法,在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. PHP中阶,PHP进阶
  2. c改java_Android NDK开发:C修改Java的属性
  3. BeyondCompare4如何破解
  4. 安卓手机获取基站信息
  5. oracle的pdb,oracle pdb基本管理
  6. 联合查询(查找所有分类及其父类)
  7. English trip EM2-LP-3A Gifts Teacher:Patrick
  8. GCC的缺陷,由匿名对象引起的内存泄漏
  9. Highcharts基础教程(七):图例(Legend)
  10. C++ 17 string_view(转载)
  11. DNS域名解析过程剖析
  12. 如何更改Google文档的默认格式设置
  13. UE4 使用自发光材质作为烘焙光源
  14. VSCode配置文件“.vscode/c_cpp_properties.json”不断被覆盖的原因及解决方法
  15. 如何将零碎信息结构化并做到有序安放,以实现知识积累?
  16. gRPC详细入门教程,Golang/Python/PHP多语言讲解
  17. The quieter you become,The more you are able to hear.
  18. 剑魂之刃登录显示服务器异常,剑魂之刃8月1日服务器维护 维护补偿公告
  19. 光伏行业报告:N型发展推动POE胶膜应用,POE产业链进入红利期
  20. oracle精度说明符1~38_ORACLE 中NUMBER类型默认的精度和Scale问题

热门文章

  1. 如何下载完整的ie6sp1
  2. 需求工程的“拨乱反正”
  3. 关于论坛、博客、SNS三者之间的区别
  4. 游戏原来也可以严肃?——严肃游戏及在中国的应用前景
  5. 软件项目管理【期末模拟卷】
  6. 眉山市职称计算机成绩,眉山市2014年第2次(4月份)全国职称计算机考试成绩.doc
  7. 文件夹中文件名称的获取,并相应的添加或删除对应的文件夹或文佳
  8. 解释java程序所使用的命令是,【单选题】Java 源程序的解释命令是
  9. TMS320C6748开发视频教程笔记 第6章 GEL 文件
  10. 25 匹马,5 个赛道,没有计时器,请问最低多少次可以找出跑得最快的 3匹马