golang net包学习笔记
阅读源代码发现在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包学习笔记的更多相关文章
- R parallel包学习笔记2
这个部分我在datacamp上面学习笔记,可视化的性能很差,使用的函数也很少. 可以参考一下大佬的博客园个人感觉他们讲的真的很详细 https://cosx.org/2016/09/r-and-par ...
- R Tidyverse dplyr包学习笔记2
Tidyverse 学习笔记 1.gapminder 我理解的gapminder应该是一个内置的数据集 加载之后使用 > # Load the gapminder package > li ...
- pandas包学习笔记
目录 zip Importing & exporting data Plotting with pandas Visual exploratory data analysis 折线图 散点图 ...
- java.util.concurrent包学习笔记(一)Executor框架
类图: 其实从类图我们能发现concurrent包(除去java.util.concurrent.atomic 和 java.util.concurrent.locks)中的内容并没有特别多,大概分为 ...
- [Golang] Gin框架学习笔记
0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...
- scikit-learn包学习笔记1
dataset 在scikit-learn包自带的数据集,R包也自带数据集iris鸢尾花数据集,做训练集.特征较少. from sklearn import datasets # Import nec ...
- pyecharts包学习笔记
目录 pyecharts包简介 特性 or 优点 版本 pyecharts包简介 精巧的图表设计.原作者说,当数据分析遇到数据可视化的时候github,该包就诞生了. 可以批量,直观的输出可视化图标吧 ...
- 如何打jar包 学习笔记
jar包是由.class文件压缩而成.要查看jar包中的内容,使用压缩工具 解压缩即可.也可以做修改,并重新打成jar包.总结一下最近学到的一些打jar包的方法: 一.DOS下使用jar命令 打jar ...
- Java中的包学习笔记
一.总结 1.引入包的概念的原因和包的作用比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,包实际上就是 ...
随机推荐
- JavaScript判断数据类型的4中方法
一: typeof typeof 是一种运算符,它的值有如下几种(number.boolean.string.undefined.null.function.object.symbol) consol ...
- shell脚本编程数组
数组: 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合 数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为 ...
- spark安装(windows)
1.安装jdk 因为spark是依赖java环境的,所以在安装spark之前你先确保你的电脑上有java环境. 具体怎么操作,百度"jdk安装" 2.安装spark 首先到官网下载 ...
- 【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限
数据库环境还和原来一样,只是从Statement换成了PrepareStatement,都说PrepareStatement因为预编译比Statement快,但是实际运行真快不了多少. 代码如下: p ...
- 1.2 Go语言基础之变量和常量
变量和常量是编程中必不可少的部分,也是很好理解的一部分. 一.标识符与关键字 1.1 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语言中标识符由字 ...
- C# List中的ForEach
; List<string> aaa = new List<string>(){ "aaa", "bbb" }; aaa.ForEach ...
- 动态库(.so)隐藏函数名
一.偶遇 error: undefined reference to xxx 问题 尝试封装通用的接口到一个private.so,然后供客户端使用,private.so编译出来后由sample.cp ...
- NetUtils网络连接工具类
import android.app.Activity; import android.content.ComponentName; import android.content.Context; i ...
- 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
每个HTML元素都具有clientHeight offsetHeight scrollHeight offsetTop scrollTop 这5个和元素高度.滚动.位置相关的属性,单凭单词很难搞清楚分 ...
- nginx配置, 启动命令, 反向代理配置
2014年1月3日 13:52:07 喜欢这样的风格,干货 http://huoding.com/2013/10/23/290 -----------------下边是我自己的经验(windows)- ...