Golang在Ubuntu上进行网络编程时,可利用标准库net和net/http实现多种协议通信,以下是关键技巧和示例:
TCP通信
net.Listen("tcp", ":端口号")监听端口,通过Accept()接受连接,每个连接用goroutine处理以实现并发。// 示例:TCP服务器
listener, _ := net.Listen("tcp", ":8080")
defer listener.Close()
for {
conn, _ := listener.Accept()
go handleConnection(conn) // 处理连接的函数
}
net.Dial("tcp", "服务器地址:端口")连接服务器,使用Write()发送数据,Read()接收响应。// 示例:TCP客户端
conn, _ := net.Dial("tcp", "localhost:8080")
defer conn.Close()
conn.Write([]byte("Hello Server"))
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
fmt.Println(string(buffer[:n]))
UDP通信
net.ListenUDP("udp", &net.UDPAddr{Port: 端口号})监听,通过ReadFromUDP()接收数据,WriteToUDP()发送响应。// 示例:UDP服务器
addr, _ := net.ResolveUDPAddr("udp", ":8080")
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()
buffer := make([]byte, 1024)
n, clientAddr, _ := conn.ReadFromUDP(buffer)
conn.WriteToUDP([]byte("Received"), clientAddr)
net.DialUDP("udp", nil, &net.UDPAddr{IP: IP地址, Port: 端口号})连接,直接发送和接收数据。// 示例:UDP客户端
addr, _ := net.ResolveUDPAddr("udp", "localhost:8080")
conn, _ := net.DialUDP("udp", nil, addr)
defer conn.Close()
conn.Write([]byte("Hello UDP Server"))
buffer := make([]byte, 1024)
n, _, _ := conn.ReadFromUDP(buffer)
fmt.Println(string(buffer[:n]))
使用net/http包快速搭建HTTP服务,支持GET/POST请求和JSON响应。
// 示例:HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, HTTP!")
})
http.ListenAndServe(":8080", nil)
// 示例:HTTP客户端
resp, _ := http.Get("http://localhost:8080")
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
goroutine处理每个连接,避免阻塞主线程。例如TCP服务器中,每个客户端连接都启动一个goroutine。net包函数返回的错误,如Listen、Dial、Read等操作可能因端口占用或网络问题失败。defer关闭连接(conn.Close()),避免资源泄漏。gorilla/websocket库实现双向通信,适用于实时应用(如聊天室)。以上技巧基于Go标准库,无需额外安装依赖,适合快速开发Ubuntu上的网络应用。