全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-14 10 分钟 ✍️ juanwangdev

Go net包

Go标准库net提供网络通信功能,支持TCP、UDP、IP等协议。

TCP服务端

net.Listen

Go
import "net"

// 创建TCP监听器
listener, err := net.Listen("tcp", ":8080")
if err != nil {
    log.Fatal(err)
}
defer listener.Close()

for {
    // 接受连接
    conn, err := listener.Accept()
    if err != nil {
        log.Println(err)
        continue
    }

    // 处理连接(通常用goroutine)
    go handleConnection(conn)
}

处理连接

Go
func handleConnection(conn net.Conn) {
    defer conn.Close()

    // 读取数据
    buf := make([]byte, 1024)
    n, err := conn.Read(buf)
    if err != nil {
        log.Println(err)
        return
    }

    // 写入响应
    conn.Write(buf[:n])
}

TCP客户端

net.Dial

Go
// 连接TCP服务
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

// 发送数据
conn.Write([]byte("hello"))

// 接收响应
buf := make([]byte, 1024)
n, _ := conn.Read(buf)
fmt.Println(buf[:n])

DialTimeout

Go
// 带超时连接
conn, err := net.DialTimeout("tcp", "localhost:8080", 5*time.Second)
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

UDP服务端

net.ListenUDP

Go
// UDP监听
addr, _ := net.ResolveUDPAddr("udp", ":8080")
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()

buf := make([]byte, 1024)

for {
    // 接收数据
    n, clientAddr, _ := conn.ReadFromUDP(buf)
    fmt.Println(buf[:n])

    // 发送响应
    conn.WriteToUDP(buf[:n], clientAddr)
}

UDP客户端

net.DialUDP

Go
// UDP连接
addr, _ := net.ResolveUDPAddr("udp", "localhost:8080")
conn, _ := net.DialUDP("udp", nil, addr)
defer conn.Close()

// 发送数据
conn.Write([]byte("hello"))

// 接收响应
buf := make([]byte, 1024)
n, _ := conn.Read(buf)
fmt.Println(buf[:n])

地址解析

ResolveTCPAddr

Go
// 解析TCP地址
addr, err := net.ResolveTCPAddr("tcp", "localhost:8080")
if err != nil {
    log.Fatal(err)
}

fmt.Println(addr.IP)     // IP地址
fmt.Println(addr.Port)   // 端口
fmt.Println(addr.Zone)   // IPv6区域

ResolveUDPAddr

Go
// 解析UDP地址
addr, _ := net.ResolveUDPAddr("udp", "localhost:8080")

ResolveIPAddr

Go
// 解析IP地址
addr, _ := net.ResolveIPAddr("ip", "localhost")

DNS解析

net.LookupHost

Go
// 主机名解析为IP
ips, err := net.LookupHost("google.com")
if err != nil {
    log.Fatal(err)
}

for _, ip := range ips {
    fmt.Println(ip)
}
// 输出所有IP地址

net.LookupIP

Go
// 返回IP地址列表
ips, _ := net.LookupIP("localhost")
for _, ip := range ips {
    fmt.Println(ip)
}

net.LookupPort

Go
// 端口名解析为端口号
port, _ := net.LookupPort("tcp", "http")
fmt.Println(port)  // 80

net.LookupAddr

Go
// IP反向解析主机名
names, _ := net.LookupAddr("127.0.0.1")
fmt.Println(names)  // ["localhost"]

IP地址处理

net.ParseIP

Go
// 解析IP字符串
ip := net.ParseIP("192.168.1.1")
if ip == nil {
    fmt.Println("无效IP")
}

fmt.Println(ip)            // 192.168.1.1
fmt.Println(ip.To4())      // IPv4格式
fmt.Println(ip.To16())     // IPv16格式
fmt.Println(ip.IsLoopback()) // false

IP类型判断

Go
ip := net.ParseIP("192.168.1.1")

// 类型判断
ip.IsLoopback()     // 是否回环地址
ip.IsPrivate()      // 是否私有地址
ip.IsGlobalUnicast() // 是否全球单播
ip.IsMulticast()    // 是否多播地址
ip.IsInterfaceLocalMulticast() // 是否接口本地多播

IP常用函数表

函数用途示例
ParseIP解析IP字符串ParseIP("1.2.3.4")
IPv4构造IPv4IPv4(1, 2, 3, 4)
To4转IPv4格式ip.To4()
To16转IPv6格式ip.To16()
IsLoopback是否回环ip.IsLoopback()
IsPrivate是否私有ip.IsPrivate()

net.Conn接口

Conn方法

Go
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
    SetReadDeadline(t time.Time) error
    SetWriteDeadline(t time.Time) error
}

// RemoteAddr获取客户端地址
clientAddr := conn.RemoteAddr()

超时设置

SetDeadline

Go
// 设置读写超时
conn.SetDeadline(time.Now().Add(10 * time.Second))

// 设置读超时
conn.SetReadDeadline(time.Now().Add(5 * time.Second))

// 设置写超时
conn.SetWriteDeadline(time.Now().Add(5 * time.Second))

网络类型

类型说明示例
tcpTCP协议"tcp", ":8080"
tcp4TCP IPv4"tcp4", ":8080"
tcp6TCP IPv6"tcp6", ":8080"
udpUDP协议"udp", ":8080"
udp4UDP IPv4"udp4", ":8080"
udp6UDP IPv6"udp6", ":8080"
ipIP协议"ip", "127.0.0.1"

端口格式

Go
// 端口格式
":8080"       // 本地端口
"localhost:8080"  // 本地地址+端口
"192.168.1.1:8080" // IP+端口
"[::1]:8080"   // IPv6+端口

// 特殊端口
":0"  // 系统自动分配端口

获取本地地址

Go
// 获取本地地址
conn, _ := net.Dial("tcp", "localhost:8080")
localAddr := conn.LocalAddr()
fmt.Println(localAddr)  // 本地IP和端口

// 获取远程地址
remoteAddr := conn.RemoteAddr()
fmt.Println(remoteAddr)  // 服务端IP和端口

SplitHostPort

Go
// 分割主机和端口
host, port, _ := net.SplitHostPort("localhost:8080")
fmt.Println(host)  // localhost
fmt.Println(port)  // 8080

// 处理IPv6
host, port, _ := net.SplitHostPort("[::1]:8080")
fmt.Println(host)  // ::1
fmt.Println(port)  // 8080

JoinHostPort

Go
// 合并主机和端口
addr := net.JoinHostPort("localhost", "8080")
fmt.Println(addr)  // localhost:8080

addr = net.JoinHostPort("::1", "8080")
fmt.Println(addr)  // [::1]:8080

常用函数表

函数用途返回值
Listen创建监听器Listener, err
Dial连接服务端Conn, err
DialTimeout带超时连接Conn, err
ListenUDPUDP监听UDPConn, err
DialUDPUDP连接UDPConn, err
ResolveTCPAddr解析TCP地址TCPAddr, err
ResolveUDPAddr解析UDP地址UDPAddr, err
ParseIP解析IP地址IP
LookupHostDNS解析[]string, err
LookupIPIP解析[]IP, err
SplitHostPort分割主机端口host, port, err
JoinHostPort合合主机端口string

要点总结

  • Listen创建TCP监听器
  • Accept接受客户端连接
  • Dial连接TCP服务端
  • DialTimeout带超时连接
  • ListenUDP/DialUDP处理UDP
  • Read/Write读写数据
  • SetDeadline设置超时
  • RemoteAddr获取客户端地址
  • ParseIP解析IP字符串
  • LookupHostDNS解析域名
  • SplitHostPort分割主机端口
  • TCP适合可靠传输,UDP适合高效传输
  • goroutine处理并发连接

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go log包
下一篇 → Go os包
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库