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上的網絡應用。