阅读源代码发现在net包中主要实现了ip、tcp、udp、unix等通信方式。它们大致可以分成两大类;其一,ip、udp、unix(DGRAM),这是一些无链接的协议,其二,tcp、unix(STREAM),需要建立链接。net对这两类协议的使用有一些区别,最明显的是对于tcp、unix(STEAM)这些协议需要使用一个Listener接口来进行服务端的监听,

其中每一种通信方式都使用 xxConn 结构体来表示,诸如IPConn、TCPConn等,这些结构体都实现了Conn接口,Conn接口实现了基本的读、写、关闭、获取远程和本地地址、设置timeout等功能。

 type Conn interface {

     Read(b []byte) (n int, err error)

     Write(b []byte) (n int, err error)

     Close() error

     LocalAddr() Addr

     RemoteAddr() Addr

     SetDeadline(t time.Time) error

     SetReadDeadline(t time.Time) error

     SetWriteDeadline(t time.Time) error
}

1、ip

使用IPConn结构体来表示,它实现了Conn、PacketConn两种接口。使用如下两个函数进行Dial和Listen。

 func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)   

 func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error)

2、tcp

使用TCPConn结构体来表示,它实现了Conn接口。

使用DialTCP进行Dial操作:

func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)

使用 ListenTCP函数进行Listen,产生一个TCPListener结构体

func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)

使用TCPListener的AcceptTCP方法建立通信链路,得到TCPConn。

3、udp

使用UDPConn接口体来表示,它实现了Conn、PacketConn两种接口。使用如下两个函数进行Dial和Listen。

func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error)    

func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error)

4、unix

UnixConn实现了Conn、PacketConn两种接口,其中unix又分为SOCK_DGRAM、SOCK_STREAM。

4.1 对于unix(SOCK_DGRAM),使用如下两个函数进行Dial和Listen。

func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)    

func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error)

4.2 对于unix(SOCK_STREAM)

客户端使用DialUnix进行Dial操作

func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)

服务端使用ListenUnix函数进行Listen操作,然后使用UnixListener进行AcceptUnix

func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error)

5 为了使用方便,golang将一些重复的操作集中到一个函数中。

可以发现上述几种通信,都得有Dialxxx、Listenxxx操作,但是根据有无链接,有分成了两大类,其中一种Listenxxx后直接返回对应的xxxConn,另一种Listenxxx后得到xxxListener,还需要借助Accepxxx进行获取xxxConn。所以为了偷懒,又有如下函数:

 func ListenPacket(net, laddr string) (PacketConn, error) 

这个函数用于侦听ip、udp、unix(DGRAM)等协议,返回一个PacketConn接口,同样根据侦听的协议不同,这个接口可以包含IPCon、UDPConn、UnixConn等,它们都实现了PacketConn。可以发现与ip、unix(stream)协议不同,直接返回的是xxConn,不是间接的通过Listener进行Accept操作后,才得到一个Conn。

 func Listen(net, laddr string) (Listener, error)

这个函数用于侦听tcp、unix(stream)等协议,返回一个Listener接口、根据侦听的协议不同,这个接口可以包含TCPListener、UnixListener等,它们都实现了Listener接口,然后通过调用其Accept方法可以得到Conn接口,进行通信。

 func Dial(network, address string) (Conn, error)

这个函数对于所有的协议都是相同的操作,返回一个Conn接口,根据协议的不同实际上包含IPConn、UDPConn、UnixConn、IPConn,它们都实现了Conn接口

golang net包学习笔记的更多相关文章

  1. R parallel包学习笔记2

    这个部分我在datacamp上面学习笔记,可视化的性能很差,使用的函数也很少. 可以参考一下大佬的博客园个人感觉他们讲的真的很详细 https://cosx.org/2016/09/r-and-par ...

  2. R Tidyverse dplyr包学习笔记2

    Tidyverse 学习笔记 1.gapminder 我理解的gapminder应该是一个内置的数据集 加载之后使用 > # Load the gapminder package > li ...

  3. pandas包学习笔记

    目录 zip Importing & exporting data Plotting with pandas Visual exploratory data analysis 折线图 散点图 ...

  4. java.util.concurrent包学习笔记(一)Executor框架

    类图: 其实从类图我们能发现concurrent包(除去java.util.concurrent.atomic 和 java.util.concurrent.locks)中的内容并没有特别多,大概分为 ...

  5. [Golang] Gin框架学习笔记

    0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...

  6. scikit-learn包学习笔记1

    dataset 在scikit-learn包自带的数据集,R包也自带数据集iris鸢尾花数据集,做训练集.特征较少. from sklearn import datasets # Import nec ...

  7. pyecharts包学习笔记

    目录 pyecharts包简介 特性 or 优点 版本 pyecharts包简介 精巧的图表设计.原作者说,当数据分析遇到数据可视化的时候github,该包就诞生了. 可以批量,直观的输出可视化图标吧 ...

  8. 如何打jar包 学习笔记

    jar包是由.class文件压缩而成.要查看jar包中的内容,使用压缩工具 解压缩即可.也可以做修改,并重新打成jar包.总结一下最近学到的一些打jar包的方法: 一.DOS下使用jar命令 打jar ...

  9. Java中的包学习笔记

    一.总结 1.引入包的概念的原因和包的作用比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,包实际上就是 ...

随机推荐

  1. CodeForces Good Bye 2016

    A题,水题略过. B题,也水,但是想复杂了.只要运动超出[0,20000]的范围就算不可能了. C题,我自己的方法是解不等式,然后取最大的答案即可.代码如下: #include <stdio.h ...

  2. ACM之路(16)—— 数位DP

    题目就是kuangbin的数位DP. 先讲C题,不要62,差不多就是一个模板题.要注意的是按位来的话,光一个pos是不够的,还需要一维来记录当前位置是什么数字,这样才能防止同一个pos不同数字的dp值 ...

  3. vue 循环Redio

    标准用法,做个笔记.(图示是elementUI,其他框架大同小异) <el-radio-group @change="changePayHandler" v-model=&q ...

  4. APP消息推送是否进入消息中心和click、receive事件分析

    前端时间研究APP消息推送的机制,由于机型.版本的碎片化,消息推送的机制不太好理解,所以总结下,放在博文里以备后续查阅. 安卓Android系统的消息推送:     安卓 推送方式 应用状态 类型 消 ...

  5. 转 MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法

    http://blog.sina.com.cn/s/blog_637e04c9010117ri.html 1 问题 [root@localhost mysql]# /etc/rc.d/init.d/m ...

  6. [Distributed ML] Yi WANG's talk

    王益,分布式机器学习的践行者,他的足迹值得后来者学习. 膜拜策略: LinkedIn高级分析师王益:大数据时代的理想主义和现实主义(图灵访谈)[心路历程] 分布式机器学习的故事-王益[历史由来] 分布 ...

  7. LAMP之Apache调优

    一.环境的搭建 实验环境: 操作系统:Centos 7.4 [root@xuegod70 ~]# ls apr-1.6.3.tar.gz apr-util-1.6.1.tar.bz2 httpd-2. ...

  8. Linux系统管理_主题02 :管好文件(1)_2.4 链接文件_ln

    在 Linux 中,链接有两种:符号链接(symbolic link)和硬链接(hard link).  删除一个符号链接不会影响到这个符号链接指向的目标文件或目 录:  反过来,删除.移动或者重 ...

  9. Python 的内置函数__import__

    我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工作的.     在一些程序中,我 ...

  10. 等待数据库引擎恢复句柄失败 SqlServer2012安装时报错 Win10

    上周,在一批Win10系统电脑上安装SqlServer 2012时,屡次发生报错,安装失败,显示的失败信息是:等待数据库引擎恢复句柄失败 如下图所示: 面对这样的错误,我的第一反应是百度,在百度上找了 ...