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 | 构造IPv4 | IPv4(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))
网络类型
| 类型 | 说明 | 示例 |
|---|---|---|
| tcp | TCP协议 | "tcp", ":8080" |
| tcp4 | TCP IPv4 | "tcp4", ":8080" |
| tcp6 | TCP IPv6 | "tcp6", ":8080" |
| udp | UDP协议 | "udp", ":8080" |
| udp4 | UDP IPv4 | "udp4", ":8080" |
| udp6 | UDP IPv6 | "udp6", ":8080" |
| ip | IP协议 | "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 |
| ListenUDP | UDP监听 | UDPConn, err |
| DialUDP | UDP连接 | UDPConn, err |
| ResolveTCPAddr | 解析TCP地址 | TCPAddr, err |
| ResolveUDPAddr | 解析UDP地址 | UDPAddr, err |
| ParseIP | 解析IP地址 | IP |
| LookupHost | DNS解析 | []string, err |
| LookupIP | IP解析 | []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处理并发连接
📝 发现内容有误?点击此处直接编辑