工作的原因接触到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)