Skip to main content

1. 网络地址解析

net.LookupHost 解析主机名到 IP 地址。
ips, err := net.LookupHost("example.com")
if err != nil {
    log.Fatal(err)
}
for _, ip := range ips {
    fmt.Println(ip)
}
net.LookupIP 解析主机名到 IP 地址列表。
ips, err := net.LookupIP("example.com")
if err != nil {
    log.Fatal(err)
}
for _, ip := range ips {
    fmt.Println(ip)
}

2. TCP 连接

net.Dial 连接到指定网络地址(支持 “tcp”, “udp”, “unix”)。
conn, err := net.Dial("tcp", "golang.org:80")
if err != nil {
    log.Fatal(err)
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
fmt.Println(status)
net.Listen 监听指定网络地址的连接。
ln, err := net.Listen("tcp", ":8080")
if err != nil {
    log.Fatal(err)
}
for {
    conn, err := ln.Accept()
    if err != nil {
        log.Fatal(err)
    }
    go handleConnection(conn)
}
处理连接的示例函数:
func handleConnection(conn net.Conn) {
    defer conn.Close()
    for {
        message, _ := bufio.NewReader(conn).ReadString('\n')
        fmt.Print("Message Received:", string(message))
        conn.Write([]byte("Message received.\n"))
    }
}

3. UDP 连接

net.ListenUDP 监听 UDP 地址。
addr, err := net.ResolveUDPAddr("udp", ":8080")
if err != nil {
    log.Fatal(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
    log.Fatal(err)
}
buffer := make([]byte, 1024)
for {
    n, addr, err := conn.ReadFromUDP(buffer)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Received %s from %s\n", string(buffer[:n]), addr)
    _, err = conn.WriteToUDP([]byte("Message received."), addr)
    if err != nil {
        log.Fatal(err)
    }
}
net.DialUDP 连接到指定的 UDP 地址。
addr, err := net.ResolveUDPAddr("udp", "localhost:8080")
if err != nil {
    log.Fatal(err)
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
    log.Fatal(err)
}
defer conn.Close()
_, err = conn.Write([]byte("Hello UDP server"))
if err != nil {
    log.Fatal(err)
}
buffer := make([]byte, 1024)
n, _, err := conn.ReadFromUDP(buffer)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Message from server: %s\n", string(buffer[:n]))

4. 网络接口

net.Interfaces 返回系统的网络接口列表。
interfaces, err := net.Interfaces()
if err != nil {
    log.Fatal(err)
}
for _, iface := range interfaces {
    fmt.Println(iface.Name, iface.HardwareAddr)
}

5. IP 地址处理

net.ParseIP 将字符串形式的 IP 地址解析为 net.IP 类型。
ip := net.ParseIP("192.0.2.1")
if ip == nil {
    log.Fatal("Invalid IP address")
}
fmt.Println("Parsed IP:", ip.String())
net.IP net.IP 类型用于表示 IP 地址。
ip := net.ParseIP("192.0.2.1")
if ip.To4() != nil {
    fmt.Println("IPv4 address")
} else {
    fmt.Println("IPv6 address")
}

6. 域名解析

net.LookupCNAME 解析并返回域名的规范名称。
cname, err := net.LookupCNAME("www.example.com")
if err != nil {
    log.Fatal(err)
}
fmt.Println("CNAME:", cname)
net.LookupSRV 解析指定服务的 SRV 记录。
_, addrs, err := net.LookupSRV("xmpp-server", "tcp", "example.com")
if err != nil {
    log.Fatal(err)
}
for _, addr := range addrs {
    fmt.Println(addr.Target, addr.Port)
}

7. 自定义 Dialer

net.Dialer 使用自定义配置进行网络连接。
dialer := net.Dialer{
    Timeout: 5 * time.Second,
}
conn, err := dialer.Dial("tcp", "golang.org:80")
if err != nil {
    log.Fatal(err)
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
fmt.Println(status)

8. 错误处理

net.Error 检查错误类型是否为临时错误或超时错误。
conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
    if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
        fmt.Println("Timeout error")
    } else {
        fmt.Println("Other error")
    }
    return
}
defer conn.Close()
通过以上这些 net 包中的 API,Go 语言可以方便地处理网络编程相关的任务。根据具体需求,可以进行更加复杂的网络应用开发。