【Go語言快速上手】第二部分:Go語言進階之網絡編程

文章目錄

  • 前言:網絡編程
  • 一、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 協議的支持。通過內置的 netnet/http 包,Go 使得網絡編程變得簡潔高效。我們也可以使用第三方庫,如 gorilla/websocket 來簡化 WebSocket 的使用。

一、TCP/UDP 編程:net 包的使用

Go 的 net 包提供了多種方法來處理 TCP 和 UDP 網絡編程。你可以通過它創建網絡連接、發送和接收數據。

1. TCP 編程

TCP 是面向連接的協議,它保證數據的可靠傳輸。在 Go 中,可以使用 net 包提供的 DialListen 方法來建立 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 包提供的 ListenUDPDialUDP 方法來處理 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.Gethttp.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 服務器并發送消息,然后等待服務器的響應。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

王炸 用AI+飛書 分解 一鍵生成 項目計劃表模版

效果圖: 各字段設置: 以下是一個使用 AI(DeepSeeker) 飛書多維表格分解項目待辦模板的示例,你可以根據實際情況進行調整和優化: 列表中需要選擇對象,且選擇輸出結果(記得控制字符長度…

從月牙定理看古希臘數學的奇妙突破

文章目錄 每日一句正能量前言古希臘人的 “化圓為方” 之夢(一)幾何作圖的基本規則(二)化圓為方問題的起源與發展(三)化圓為方的意義 月牙面積定理的誕生(一)希波克拉底的生平與成就…

實戰:vLLM多機多卡部署大模型

兩臺服務器 1. Docker容器中使用GPU 必須確保已安裝并配置 NVIDIA Docker。你可以安裝 nvidia-docker 來確保 GPU 驅動能夠被 Docker 使用 #安裝 nvidia-docker: sudo apt-get install nvidia-docker2#然后重啟 Docker: sudo systemctl restart docke…

LLM中種子(Seed)作用是什么:多樣性

LLM中種子(Seed)作用是什么:多樣性 目錄 LLM中種子(Seed)作用是什么:多樣性作用舉例不同種子的區別設置不同種子的原因在LLM(大語言模型)中,種子(Seed)用于初始化隨機數生成器,發揮著確保結果可重復性的關鍵作用,具體如下: 作用 當大語言模型生成文本時,很多操…

neo4j二進制部署

neo4j二進制部署 下載所需組件 jdk 17 neo4j 5.2.0 配置文件 server.default_listen_address0.0.0.0環境變量 export JAVA_HOME/usr/local/jdk-17.0.13 export CLASSPATH.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH$…

Win10環境使用零訊ZeroNews內網穿透實現Deepseek對外服務

Win10環境使用零訊ZeroNews內網穿透實現Deepseek對外服務 前言 之前筆者已經在Win10環境搭建好了Ollama、DeepSeek、Open WebUI、Dify等組件,成功實現了私有化部署及內網訪問: https://lizhiyong.blog.csdn.net/article/details/145505686 https://l…

spconv 安裝測試

pip install spconv 報錯: File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/mod…

MySQL 查詢緩存技術深度解析

在現代數據庫管理系統中,查詢性能優化是提升應用響應速度和用戶體驗的關鍵環節。MySQL 作為一款廣泛使用的開源關系型數據庫,提供了查詢緩存功能,用于緩存查詢結果,從而在后續相同的查詢請求時能夠快速返回結果,減少數…

halcon 條形碼、二維碼識別、opencv識別

一、條形碼 函數介紹 create_bar_code_model * 1.創建條碼讀取器的模板 * 參數一:通用參數的名稱,針對條形碼模型進行調整。默認值為空 * 參數二:針對條形碼模型進行調整 * 參數三:條形碼模型的句柄。 create_bar_code_model (…

一個簡潔高效的Flask用戶管理示例

Flask-Login 是 Flask 的用戶管理擴展,提供 用戶身份驗證、會話管理、權限控制 等功能。 適用于: ? 用戶登錄、登出 ? 記住用戶(“記住我” 功能) ? 限制未登錄用戶訪問某些頁面 ? 用戶會話管理 1. 安裝 Flask-Login pi…

HashSet 的底層原理(簡單易懂)

在 Java 集合框架中,HashSet 是一個非常常用的集合類,它提供了快速的元素查找和插入操作。那么,HashSet 的底層是如何實現這些高效操作的呢?本文將深入探討 HashSet 的底層原理。 一、HashSet 的基本概念 HashSet 是基于哈希表的…

【學習資源】時間序列數據分析方法(2)-mWDN和AutoEncoder

接著上次的【學習資源】時間序列數據分析方法(1)-CSDN博客,本次介紹mWDN和AutoEncoder 解決時序數據分類的方法。介紹模型原理、應用場景和參考代碼。也從模型性能、訓練效率、模型復雜度、計算復雜度、可解釋性、適應性和泛化能力、健壯性、…

[LeetCode力扣hot100]-鏈表

相交鏈表 160. 相交鏈表 - 力扣(LeetCode) 思路就是遍歷兩個鏈表,有相同的部分就可以視為相交。 但是長度不一樣,比如兩個會相交的鏈表,headA 的長度為 a c,headB 的長度為 b c,其中 c 是公…

JAVA EE初階 - 預備知識(四)

一、API API 即應用程序編程接口(Application Programming Interface),是一組定義、協議和工具,用于不同軟件組件、應用程序或系統之間進行交互和通信。以下從多個方面詳細介紹 API: 基本概念 接口規范:A…

【TI C2000】F28002x的系統延時、GPIO配置及SCI(UART)串口發送、接收

【TI C2000】F28002x的系統延時、GPIO配置及SCI(UART)串口發送、接收 文章目錄 系統延時GPIO配置GPIO輸出SCI配置SCI發送、接收測試附錄:F28002x開發板上手、環境配置、燒錄及TMS320F280025C模板工程建立F28002x敘述燒錄SDK庫文件說明工程建…

親測有效!使用Ollama本地部署DeepSeekR1模型,指定目錄安裝并實現可視化聊天與接口調用

文章目錄 一、引言二、準備工作(Ollama 工具介紹與下載)2.1 Ollama介紹2.2 Ollama安裝 三、指定目錄安裝 DeepSeek R1四、Chatbox 可視化聊天搭建4.1 Chatbox下載安裝4.2 關聯 DeepSeek R1 與 Chatbox 的步驟 五、使用 Ollama 調用 DeepSeek 接口5.1 請求…

期權隱含波動率是什么意思?

財順小編本文主要介紹期權隱含波動率是什么意思?期權隱含波動率(Implied Volatility)是根據當前期權市場價格,利用期權定價模型(如Black-Scholes模型)推導出的關于合約標的理論上的價格波動率。它反映了市場…

Python 面向對象的三大特征

前言:本篇講解面向對象的三大特征(封裝,繼承,多態),還有比較細致的(類屬性類方法,靜態方法),分步驟講解,比較適合理清楚三大特征的思路 面向對象的…

Jmeter如何計算TPS

1.在jmeter中計算出接口請求的個數 1175 1172 1172 174 200 416 384 1174 5867 2.計算接口平均響應時間 計算每個接口的請求次數乘以平均響應時間,所有接口相加,然后除以所有接口的數量總和,得到接口的平均響應時間 (1175*18191172*…

github上文件過大無法推送問題

GitHub 對文件大小有限制,超過 100 MB 的文件無法直接推送到倉庫中。 解決思路: 使用 Git Large File Storage (Git LFS) 來管理大文件不上傳對應的大文件 使用Git LFS: 1. 安裝 Git LFS 首先,你需要安裝 Git LFS。可以按照以…