工作的原因接触到socket,要使用socket实现一个长连接。之前只在C/C++上用过socket,而且在学校的时候也只是简单的做聊天室小程序,并没有涉及到长连接。突然用到工作项目上,心里还是有点悬的,毕竟网上的资料也不是很多。这里就一步一步记录下学习的过程、遇到的问题以及最重要的——解决问题的方法。

一、说明

golang中的socket需要用到net包,里面封装好了很多常用的函数方法以及元素类型。而且无需像C一样要经历socket,bind,listen,accept等等流程,只需要简单的几步流程就能完成,非常方便。

二、IP类型

net包中定义的ip类型直接就是byte数组:

func parseIP(s string) IP

三、函数

3.1 funcResolveTCPAddr(net, addr string) (*TCPAddr, error)

ResolveTCPAddripport
nettcptcp4tcp6tcp4addr[ip+port][domain+port]
*TCPAddr

3.2 func ResolveIPAddr(net, addr string) (*IPAddr, error)

ResolveIPAddr
netipip4ip6ip4addr
*IPAddr

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

Dial
networktcptcp4tcp6;如果是IP连接,对应ip ip4 ip6addressip+portdomain+port217.0.0.1
net.ConnWrite()Read()

与这个函数相对应的两个函数:

func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)
laddrnil

3.4 func (c *conn) Write(b []byte) (int, error)

conn[]byte

3.5 func (c *conn) Read(b []byte) (int, error)

从conn连接对象中读取数据,成功将返回读取到的字节数。

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

Listen函数在服务端使用,让服务端开始监听。

nettcpipladdrip+port127.0.0.1

相应的两个函数:

func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)

3.7 func (l *TCPListener) Accept() (Conn, error)

Accept

相应的还有一个

func (l *TCPListener) AcceptTCP() (*TCPConn, error)