golang,go,博客,开源,编程

golang标准库之net

Published on with 0 views and 0 comments

net 包是 Go 语言标准库中的一个核心网络编程包,提供了 TCP、UDP、IP、Unix 域套接字等通信方式的封装。它主要用于网络连接、服务器和客户端的开发。


1. net 包的主要功能

1.1 监听和连接

  • net.Listen(network, address): 创建监听器,等待客户端连接(如 tcpudp)。
  • net.Dial(network, address): 创建到远程服务器的连接。

1.2 IP 地址和解析

  • net.LookupIP(domain): 解析域名获取 IP 地址。
  • net.ResolveTCPAddr(network, address): 解析 TCP 地址。

1.3 服务器开发

  • net.Listen + Accept 实现 TCP 服务器。
  • net.ListenPacket 处理 UDP 服务器。

1.4 客户端开发

  • net.Dial("tcp", "localhost:8080") 创建 TCP 连接。
  • net.DialUDP("udp", nil, udpAddr) 进行 UDP 连接。

2. 常见使用示例

2.1 TCP 服务器

package main

import (
	"fmt"
	"net"
)

func main() {
	// 监听端口
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer listener.Close()
	fmt.Println("TCP Server listening on port 8080...")

	for {
		// 等待客户端连接
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Connection error:", err)
			continue
		}

		// 处理连接
		go handleConnection(conn)
	}
}

func handleConnection(conn net.Conn) {
	defer conn.Close()
	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		fmt.Println("Read error:", err)
		return
	}

	fmt.Println("Received:", string(buffer[:n]))
	conn.Write([]byte("Hello from server!"))
}

2.2 TCP 客户端

package main

import (
	"fmt"
	"net"
)

func main() {
	// 连接服务器
	conn, err := net.Dial("tcp", "localhost:8080")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// 发送数据
	message := "Hello, Server!"
	conn.Write([]byte(message))

	// 接收数据
	buffer := make([]byte, 1024)
	n, _ := conn.Read(buffer)
	fmt.Println("Received from server:", string(buffer[:n]))
}

2.3 UDP 服务器

package main

import (
	"fmt"
	"net"
)

func main() {
	addr, _ := net.ResolveUDPAddr("udp", ":8081")
	conn, _ := net.ListenUDP("udp", addr)
	defer conn.Close()

	fmt.Println("UDP Server listening on port 8081...")
	buffer := make([]byte, 1024)

	for {
		n, clientAddr, _ := conn.ReadFromUDP(buffer)
		fmt.Println("Received:", string(buffer[:n]), "from", clientAddr)
		conn.WriteToUDP([]byte("Hello from UDP server!"), clientAddr)
	}
}

2.4 UDP 客户端

package main

import (
	"fmt"
	"net"
)

func main() {
	serverAddr, _ := net.ResolveUDPAddr("udp", "localhost:8081")
	conn, _ := net.DialUDP("udp", nil, serverAddr)
	defer conn.Close()

	// 发送数据
	message := "Hello, UDP Server!"
	conn.Write([]byte(message))

	// 接收数据
	buffer := make([]byte, 1024)
	n, _, _ := conn.ReadFromUDP(buffer)
	fmt.Println("Received from server:", string(buffer[:n]))
}

3. net/http 相关

如果你要处理 HTTP 服务器和客户端,推荐使用 net/http 包,例如:

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, HTTP!")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

4. net 相关函数

4.1 网络地址解析

addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
fmt.Println(addr)

4.2 获取本机 IP

addrs, _ := net.InterfaceAddrs()
for _, addr := range addrs {
	fmt.Println(addr.String())
}

5. 总结

  • TCP: net.Listen 创建服务器,net.Dial 创建客户端。
  • UDP: net.ListenPacket 监听,net.DialUDP 发送数据。
  • DNS 解析: net.LookupIP 查询 IP 地址。
  • HTTP 服务器: 推荐使用 net/http

net 包是 Go 网络编程的基础,理解它可以让你快速构建高效的网络应用! 🚀


标题:golang标准库之net
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/28/1740703699694.html
联系:scotttu@163.com