Go语言中的net
标准库是处理网络操作的核心库,提供了跨平台的网络接口支持。以下详细讲解其功能,并给出15个涵盖不同协议和用法的示例(含模拟输入输出):
一、基础功能概览
- 协议支持:TCP、UDP、IP、Unix域套接字
- 核心对象:
Listener
:服务端监听连接Conn
:网络连接抽象Dialer
:客户端拨号连接
- 工具函数: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()
}
}
}
三、核心函数详解
-
net.Dial(network, address string) (Conn, error)
- 建立网络连接
- 支持协议:
tcp
,tcp4
,tcp6
,udp
,udp4
,udp6
,unix
-
net.Listen(network, address string) (Listener, error)
- 创建监听器
- TCP需要指定端口:
:8080
- Unix需要文件路径:
/tmp/foo.sock
-
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 }
四、进阶用法
- 连接池管理
- 流量控制(Window Size调整)
- TLS加密通信(需配合crypto/tls)
- 多路复用(配合goroutine)
五、最佳实践建议
- 始终处理网络错误
- 使用
defer conn.Close()
防止资源泄漏 - 设置合理的超时时间
- 大数据传输时分块读写
- 生产环境建议使用
net/http
处理HTTP协议