go net包分析(一)

net包是go的基础网络包,常用于进行网络连接socket操作,其中Dial是最常用的。今天就对Dial文件里面的方法进行下总结。

Dial文件里面5个结构体分别为:
1、Dialer
2、sysDialer
3、ListenConfig
4、sysListener
5、Resolver

对外公开的方法有四个
1、Dial() 创建一个socket连接,在文件里还给了几个例子,具体用法可以参考示例

// Examples:
//  Dial("ip4:1", "192.0.2.1")
//  Dial("ip6:ipv6-icmp", "2001:db8::1")
//  Dial("ip6:58", "fe80::1%lo0")
//
// For TCP, UDP and IP networks, if the host is empty or a literal
// unspecified IP address, as in ":80", "0.0.0.0:80" or "[::]:80" for
// TCP and UDP, "", "0.0.0.0" or "::" for IP, the local system is
// assumed.
//
// For Unix networks, the address must be a file system path.
func Dial(network, address string) (Conn, error) {
    var d Dialer
    return d.Dial(network, address)
}

2、 DialTimeout 该方法是调用Dial方法,增加了一个超时时间控制。

func DialTimeout(network, address string, timeout time.Duration) (Conn, error) {
    d := Dialer{Timeout: timeout}
    return d.Dial(network, address)
}

3、Listen 服务端开启服务监听。支持"tcp", "tcp4", "tcp6", "unix" or "unixpacket" 协议

func Listen(network, address string) (Listener, error) {
    var lc ListenConfig
    return lc.Listen(context.Background(), network, address)
}

4、ListenPacket 与三功能相似,只是支持协议为"udp", "udp4", "udp6", "unixgram", 或 IP协议

func ListenPacket(network, address string) (PacketConn, error) {
    var lc ListenConfig
    return lc.ListenPacket(context.Background(), network, address)
}

下面举例说明怎么通过这几个方法,创建一个简单的socket服务
1、服务端代码

unc main()  {
    ln, err := net.Listen("tcp", ":9999")

    if err != nil {
        // handle error
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            // handle error
            continue
        }
        go handleConnection(conn)
    }


}

func handleConnection(c net.Conn)  {
    defer c.Close();
    data := make([]byte, 256);
    _,err:=c.Read(data)
    if err!=nil{
        fmt.Println(err.Error())
    }
    fmt.Println(string(data))
    c.Write([]byte("hello " + time.Now().String()+"\n"));
}

2、客户端代码

conn, err := net.Dial("tcp", "127.0.0.1:9999")
    if err != nil {
        // handle error
    }
    fmt.Fprintf(conn, "hello world")
    status, err := bufio.NewReader(conn).ReadString('\n')
    fmt.Println(status)

通过上面的示例,可以看到用go写个网络服务是多么简单,同时也在于go的net包底层封装的多么好,让你只需要简单几行代码,就可以实现一个网络服务。下一篇分析下net/http 包。

你可能感兴趣的:(go net包分析(一))