net基础包
Go语言的net包提供了对网络编程的支持,允许你创建客户端和服务器程序来处理TCP、UDP、Unix Socket等网络连接。以下是net包的一些常用功能及其用法和场景用例:
1. TCP服务器和客户端
net包提供了用于创建TCP服务器和客户端的接口。
用法示例(TCP服务器):
package main
import (
"fmt"
"io"
"net"
)
func handleClient(conn net.Conn) {
defer conn.Close()
for {
// 读取客户端数据
var buf [512]byte
n, err := conn.Read(buf[:])
if err != nil {
break
}
// 回写数据给客户端
conn.Write(buf[:n])
}
}
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn) // 为每个连接创建一个goroutine
}
}
用法示例(TCP客户端):
package main
import (
"bufio"
"fmt"
"net"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
panic(err)
}
defer conn.Close()
go func() {
for {
// 从标准输入读取数据并发送到服务器
fmt.Print("Enter message ('exit' to quit): ")
input, err := bufio.NewReader(os.Stdin).ReadString('\n')
if err != nil {
return
}
if strings.TrimSpace(input) == "exit" {
conn.Write([]byte("exit\n"))
return
}
conn.Write([]byte(input))
}
}()
// 读取服务器响应
for {
var buf [512]byte
n, err := conn.Read(buf[:])
if err != nil {
break
}
fmt.Print(string(buf[:n]))
}
}
2. UDP通信
net包同样支持UDP协议。
用法示例(UDP服务器):
package main
import (
"fmt"
"net"
)
func main() {
addr := net.UDPAddr{
Port: 8080,
IP: net.ParseIP("0.0.0.0"),
}
conn, err := net.ListenUDP("udp", &addr)
if err != nil {
panic(err)
}
defer conn.Close()
for {
buffer := make([]byte, 1024)
n, remoteAddr, err := conn.ReadFromUDP(buffer)
if err != nil {
continue // 错误处理
}
fmt.Printf("Received data from %v\n", remoteAddr)
// 处理数据...
}
}
3. 监听和解析地址
net包可以解析网络地址,并在特定的地址和端口上监听连接。解析地址通常意味着将字符串形式的网络地址转换为net.Addr类型,它是所有地址类型的共同接口。
package main
import (
"fmt"
"net"
)
func main() {
// 解析TCP地址
tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
if err != nil {
panic(err)
}
fmt.Println(tcpAddr)
}
这里ResolveTCPAddr函数接受两个参数:网络类型(如"tcp"、"udp"等)和地址(包含主机和端口号)。如果地址解析成功,它将返回一个*net.TCPAddr类型的结构。
场景用例
- Web服务器:使用http包(基于net包)创建Web服务器,提供HTTP服务。
- 远程API:创建TCP服务器以提供远程API服务,客户端通过TCP连接调用服务端的API。
- 实时通信:开发基于TCP的聊天应用或实时通信工具。
- 文件传输:创建FTP客户端和服务器,用于文件的上传和下载。
- 网络监控:开发网络监控工具,监听特定端口的数据包。
- 分布式系统:在分布式系统中,使用自定义TCP或UDP协议进行节点间通信。
- IoT设备通信:与IoT设备进行通信,收集数据或发送指令。
net包是Go语言中进行网络编程的基础,通过它可以实现各种网络通信协议和应用。