3、go语言标准库、net

Go语言中的net标准库是处理网络操作的核心库,提供了跨平台的网络接口支持。以下详细讲解其功能,并给出15个涵盖不同协议和用法的示例(含模拟输入输出):


一、基础功能概览

  1. 协议支持:TCP、UDP、IP、Unix域套接字
  2. 核心对象
    • Listener:服务端监听连接
    • Conn:网络连接抽象
    • Dialer:客户端拨号连接
  3. 工具函数:DNS解析、地址处理等

二、使用示例

示例1: TCP服务端(Echo服务器)
package main

import (
    "bufio"
    "net"
    "fmt"
)

func main() {
    ln, _ := net.Listen("tcp", ":8080")
    defer ln.Close()
  
    for {
        conn, _ := ln.Accept()
        go func(c net.Conn) {
            defer c.Close()
            reader := bufio.NewReader(c)
            text, _ := reader.ReadString('\n')
            fmt.Printf("Received: %s", text)
            c.Write([]byte("Echo: " + text))
        }(conn)
    }
}

输入/输出模拟

客户端发送:Hello Server!\n
服务端输出:Received: Hello Server!
客户端收到:Echo: Hello Server!

示例2: TCP客户端
package main

import (
    "bufio"
    "net"
    "fmt"
)

func main() {
    conn, _ := net.Dial("tcp", "localhost:8080")
    defer conn.Close()
  
    fmt.Fprintf(conn, "Hello Server!\n")
    reply, _ := bufio.NewReader(conn).ReadString('\n')
    fmt.Print("Server reply:", reply)
}

示例3: UDP服务端
package main

import (
    "net"
    "fmt"
)

func main() {
    addr, _ := net.ResolveUDPAddr("udp", ":6000")
    conn, _ := net.ListenUDP("udp", addr)
    defer conn.Close()
  
    buffer := make([]byte, 1024)
    for {
        n, addr, _ := conn.ReadFromUDP(buffer)
        fmt.Printf("Received: %s from %v\n", string(buffer[:n]), addr)
        conn.WriteToUDP([]byte("UDP Ack"), addr)
    }
}

示例4: UDP客户端
package main

import (
    "net"
    "fmt"
)

func main() {
    conn, _ := net.Dial("udp", "localhost:6000")
    defer conn.Close()
  
    conn.Write([]byte("Ping"))
    buffer := make([]byte, 1024)
    n, _ := conn.Read(buffer)
    fmt.Println("Received:", string(buffer[:n]))
}

示例5: HTTP服务器(底层TCP处理)
package main

import (
    "net"
    "fmt"
)

func main() {
    ln, _ := net.Listen("tcp", ":80")
    defer ln.Close()
  
    for {
        conn, _ := ln.Accept()
        go func(c net.Conn) {
            defer c.Close()
            response := "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World!"
            c.Write([]byte(response))
        }(conn)
    }
}

示例6: 域名解析
package main

import (
    "net"
    "fmt"
)

func main() {
    ips, _ := net.LookupIP("google.com")
    for _, ip := range ips {
        fmt.Println(ip)
    }
}
/* 输出:
216.58.200.142
...(实际IP可能变化)
*/

示例7: 超时处理
package main

import (
    "net"
    "time"
    "fmt"
)

func main() {
    conn, err := net.DialTimeout("tcp", "example.com:80", 3*time.Second)
    if err != nil {
        fmt.Println("Connection timed out")
        return
    }
    defer conn.Close()
    // 设置读取超时
    conn.SetReadDeadline(time.Now().Add(5 * time.Second))
}

示例8: Unix域套接字
// 服务端
package main

import (
    "net"
    "os"
)

func main() {
    os.Remove("/tmp/example.sock")
    ln, _ := net.Listen("unix", "/tmp/example.sock")
    defer ln.Close()
  
    conn, _ := ln.Accept()
    conn.Write([]byte("Unix domain message"))
}

示例9: 获取本机IP
package main

import (
    "net"
    "fmt"
)

func main() {
    addrs, _ := net.InterfaceAddrs()
    for _, addr := range addrs {
        if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                fmt.Println("Local IP:", ipnet.IP)
            }
        }
    }
}

示例10: 端口扫描
package main

import (
    "net"
    "fmt"
    "time"
)

func main() {
    target := "localhost"
    for port := 1; port <= 1024; port++ {
        address := fmt.Sprintf("%s:%d", target, port)
        conn, err := net.DialTimeout("tcp", address, 500*time.Millisecond)
        if err == nil {
            fmt.Printf("Port %d is open\n", port)
            conn.Close()
        }
    }
}

三、核心函数详解

  1. net.Dial(network, address string) (Conn, error)

    • 建立网络连接
    • 支持协议:tcp, tcp4, tcp6, udp, udp4, udp6, unix
  2. net.Listen(network, address string) (Listener, error)

    • 创建监听器
    • TCP需要指定端口::8080
    • Unix需要文件路径:/tmp/foo.sock
  3. Conn接口方法

    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
    }
    

四、进阶用法

  1. 连接池管理
  2. 流量控制(Window Size调整)
  3. TLS加密通信(需配合crypto/tls)
  4. 多路复用(配合goroutine)

五、最佳实践建议

  1. 始终处理网络错误
  2. 使用defer conn.Close()防止资源泄漏
  3. 设置合理的超时时间
  4. 大数据传输时分块读写
  5. 生产环境建议使用net/http处理HTTP协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚拟之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值