文章目錄
- 前言:網絡編程
- 一、TCP/UDP 編程:`net` 包的使用
- 1. TCP 編程
- 1.1 TCP 服務器
- 1.2 TCP 客戶端
- 2. UDP 編程
- 2.1 UDP 服務器
- 2.2 UDP 客戶端
- 二、HTTP 編程:`net/http` 包的使用,編寫 HTTP 服務器和客戶端
- 2.1 HTTP 服務器
- 2.2 HTTP 客戶端
- 三、WebSocket 編程:`gorilla/websocket` 包的使用
- 3.1 WebSocket 服務器
- 3.2 WebSocket 客戶端
前言:網絡編程
Go 語言提供了強大的網絡編程能力,支持 TCP/UDP 協議的開發、HTTP 服務的構建,以及 WebSocket 協議的支持。通過內置的 net
和 net/http
包,Go 使得網絡編程變得簡潔高效。我們也可以使用第三方庫,如 gorilla/websocket
來簡化 WebSocket 的使用。
一、TCP/UDP 編程:net
包的使用
Go 的 net
包提供了多種方法來處理 TCP 和 UDP 網絡編程。你可以通過它創建網絡連接、發送和接收數據。
1. TCP 編程
TCP 是面向連接的協議,它保證數據的可靠傳輸。在 Go 中,可以使用 net
包提供的 Dial
和 Listen
方法來建立 TCP 客戶端和服務器。
1.1 TCP 服務器
package mainimport ("fmt""net""log"
)func handleConnection(conn net.Conn) {fmt.Println("Client connected:", conn.RemoteAddr())defer conn.Close()conn.Write([]byte("Hello, client!"))
}func main() {// 創建 TCP 監聽listener, err := net.Listen("tcp", ":8080")if err != nil {log.Fatal(err)}defer listener.Close()fmt.Println("Server is listening on port 8080...")for {conn, err := listener.Accept() // 接受客戶端連接if err != nil {log.Fatal(err)}go handleConnection(conn) // 為每個連接啟動一個 goroutine 處理}
}
1.2 TCP 客戶端
package mainimport ("fmt""net""log"
)func main() {// 創建 TCP 客戶端連接conn, err := net.Dial("tcp", "localhost:8080")if err != nil {log.Fatal(err)}defer conn.Close()// 接收并打印服務器返回的消息buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {log.Fatal(err)}fmt.Println("Server says:", string(buffer[:n]))
}
2. UDP 編程
UDP 是無連接的協議,傳輸速度較快,但不保證數據的可靠性。在 Go 中,使用 net
包提供的 ListenUDP
和 DialUDP
方法來處理 UDP 通信。
2.1 UDP 服務器
package mainimport ("fmt""net""log"
)func main() {// 創建 UDP 監聽地址addr, err := net.ResolveUDPAddr("udp", ":8080")if err != nil {log.Fatal(err)}conn, err := net.ListenUDP("udp", addr)if err != nil {log.Fatal(err)}defer conn.Close()buffer := make([]byte, 1024)for {n, clientAddr, err := conn.ReadFromUDP(buffer)if err != nil {log.Fatal(err)}fmt.Println("Received:", string(buffer[:n]), "from", clientAddr)}
}
2.2 UDP 客戶端
package mainimport ("fmt""net""log"
)func main() {// 創建 UDP 目標地址serverAddr, err := net.ResolveUDPAddr("udp", "localhost:8080")if err != nil {log.Fatal(err)}// 創建 UDP 連接conn, err := net.DialUDP("udp", nil, serverAddr)if err != nil {log.Fatal(err)}defer conn.Close()// 發送數據message := []byte("Hello, UDP server!")_, err = conn.Write(message)if err != nil {log.Fatal(err)}fmt.Println("Message sent to server")
}
二、HTTP 編程:net/http
包的使用,編寫 HTTP 服務器和客戶端
Go 語言的 net/http
包提供了簡單而強大的 HTTP 服務器和客戶端功能。通過該包,你可以很容易地編寫 HTTP 服務器,并與 HTTP 客戶端進行通信。
2.1 HTTP 服務器
Go 提供了非常簡潔的方式來構建 HTTP 服務器。你只需要實現處理請求的函數,并通過 http.HandleFunc
注冊路由,然后調用 http.ListenAndServe
啟動服務器。
package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}func main() {http.HandleFunc("/hello", helloHandler) // 注冊路由fmt.Println("Starting server on :8080...")http.ListenAndServe(":8080", nil) // 啟動 HTTP 服務器
}
在這個示例中,HTTP 服務器會監聽 8080
端口,并且在請求 /hello
路徑時返回 Hello, World!
。
2.2 HTTP 客戶端
Go 語言的 http
包也提供了簡單的方式來發起 HTTP 請求。你可以使用 http.Get
、http.Post
等方法發起請求,并接收返回的響應。
package mainimport ("fmt""net/http""log"
)func main() {// 發起 GET 請求resp, err := http.Get("http://localhost:8080/hello")if err != nil {log.Fatal(err)}defer resp.Body.Close()// 打印響應狀態和內容fmt.Println("Response Status:", resp.Status)
}
在這個示例中,客戶端發起一個 GET 請求,訪問服務器的 /hello
路徑,獲取服務器的響應。
三、WebSocket 編程:gorilla/websocket
包的使用
WebSocket 是一種在單個連接上進行全雙工通信的協議。Go 中可以使用第三方庫 gorilla/websocket
來實現 WebSocket 服務端和客戶端。
3.1 WebSocket 服務器
首先,你需要安裝 gorilla/websocket
包:
go get github.com/gorilla/websocket
然后,編寫 WebSocket 服務器:
package mainimport ("fmt""log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true },
}func handleConnection(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}defer conn.Close()for {messageType, p, err := conn.ReadMessage()if err != nil {log.Println(err)return}if err := conn.WriteMessage(messageType, p); err != nil {log.Println(err)return}}
}func main() {http.HandleFunc("/ws", handleConnection)fmt.Println("WebSocket server is running on :8080...")log.Fatal(http.ListenAndServe(":8080", nil))
}
3.2 WebSocket 客戶端
WebSocket 客戶端同樣也可以使用 gorilla/websocket
包來連接到 WebSocket 服務器。
package mainimport ("fmt""log""github.com/gorilla/websocket"
)func main() {// 連接到 WebSocket 服務器conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)if err != nil {log.Fatal(err)}defer conn.Close()message := []byte("Hello, WebSocket server!")err = conn.WriteMessage(websocket.TextMessage, message)if err != nil {log.Fatal(err)}_, response, err := conn.ReadMessage()if err != nil {log.Fatal(err)}fmt.Println("Received from server:", string(response))
}
在這個示例中,WebSocket 客戶端連接到 WebSocket 服務器并發送消息,然后等待服務器的響應。