日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Go 語言高級(jí)網(wǎng)絡(luò)編程

來源: 責(zé)編: 時(shí)間:2023-11-06 17:18:54 272觀看
導(dǎo)讀一、簡(jiǎn)介Go(Golang)中的網(wǎng)絡(luò)編程具有易用性、強(qiáng)大性和樂趣。本指南深入探討了網(wǎng)絡(luò)編程的復(fù)雜性,涵蓋了協(xié)議、TCP/UDP 套接字、并發(fā)等方面的內(nèi)容,并附有詳細(xì)的注釋。二、關(guān)鍵概念1. 網(wǎng)絡(luò)協(xié)議TCP(傳輸控制協(xié)議):確保可靠的數(shù)據(jù)

一、簡(jiǎn)介

Go(Golang)中的網(wǎng)絡(luò)編程具有易用性、強(qiáng)大性和樂趣。本指南深入探討了網(wǎng)絡(luò)編程的復(fù)雜性,涵蓋了協(xié)議、TCP/UDP 套接字、并發(fā)等方面的內(nèi)容,并附有詳細(xì)的注釋。9d928資訊網(wǎng)——每日最新資訊28at.com

9d928資訊網(wǎng)——每日最新資訊28at.com

二、關(guān)鍵概念

1. 網(wǎng)絡(luò)協(xié)議

  • TCP(傳輸控制協(xié)議):確保可靠的數(shù)據(jù)傳輸。
  • UDP(用戶數(shù)據(jù)報(bào)協(xié)議):更快,但不保證數(shù)據(jù)傳遞。

2. 套接字

  • TCP 套接字:用于面向連接的通信。
  • UDP 套接字:用于無連接通信。

3. 并發(fā)

  • Goroutines(協(xié)程):允許在代碼中實(shí)現(xiàn)并行處理。
  • Channels(通道):用于協(xié)程之間的通信。

三、示例

示例 1:TCP 服務(wù)器和客戶端

TCP 服務(wù)器和客戶端示例演示了TCP通信的基礎(chǔ)。9d928資訊網(wǎng)——每日最新資訊28at.com

服務(wù)器:9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "fmt")func main() { // Listen on TCP port 8080 on all available unicast and // any unicast IP addresses. listen, err := net.Listen("tcp", ":8080") if err != nil {  fmt.Println(err)  return } defer listen.Close() // Infinite loop to handle incoming connections for {  conn, err := listen.Accept()  if err != nil {   fmt.Println(err)   continue  }  // Launch a new goroutine to handle the connection  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection into the buffer. _, err := conn.Read(buffer) if err != nil {  fmt.Println(err)  return } // Send a response back to the client. conn.Write([]byte("Received: " + string(buffer)))}

客戶端:9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "fmt")func main() { // Connect to the server at localhost on port 8080. conn, err := net.Dial("tcp", "localhost:8080") if err != nil {  fmt.Println(err)  return } defer conn.Close() // Send a message to the server. conn.Write([]byte("Hello, server!")) buffer := make([]byte, 1024) // Read the response from the server. conn.Read(buffer) fmt.Println(string(buffer))}

服務(wù)器在端口8080上等待連接,讀取傳入的消息并發(fā)送響應(yīng)。客戶端連接到服務(wù)器,發(fā)送消息并打印服務(wù)器的響應(yīng)。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 2:UDP 服務(wù)器和客戶端

與TCP不同,UDP是無連接的。以下是UDP服務(wù)器和客戶端的實(shí)現(xiàn)。9d928資訊網(wǎng)——每日最新資訊28at.com

服務(wù)器:9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "fmt")func main() { // Listen for incoming UDP packets on port 8080. conn, err := net.ListenPacket("udp", ":8080") if err != nil {  fmt.Println(err)  return } defer conn.Close() buffer := make([]byte, 1024) // Read the incoming packet data into the buffer. n, addr, err := conn.ReadFrom(buffer) if err != nil {  fmt.Println(err)  return } fmt.Println("Received: ", string(buffer[:n])) // Write a response to the client's address. conn.WriteTo([]byte("Message received!"), addr)}

客戶端:9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "fmt")func main() { // Resolve the server's address. addr, err := net.ResolveUDPAddr("udp", "localhost:8080") if err != nil {  fmt.Println(err)  return } // Dial a connection to the resolved address. conn, err := net.DialUDP("udp", nil, addr) if err != nil {  fmt.Println(err)  return } defer conn.Close() // Write a message to the server. conn.Write([]byte("Hello, server!")) buffer := make([]byte, 1024) // Read the response from the server. conn.Read(buffer) fmt.Println(string(buffer))}

服務(wù)器從任何客戶端讀取消息并發(fā)送響應(yīng)。客戶端發(fā)送消息并等待響應(yīng)。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 3:并發(fā) TCP 服務(wù)器

并發(fā)允許同時(shí)處理多個(gè)客戶端。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "fmt")func main() { // Listen on TCP port 8080. listener, err := net.Listen("tcp", ":8080") if err != nil {  fmt.Println(err)  return } defer listener.Close() for {  // Accept a connection.  conn, err := listener.Accept()  if err != nil {   fmt.Println(err)   continue  }  // Handle the connection in a new goroutine.  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection. conn.Read(buffer) fmt.Println("Received:", string(buffer)) // Respond to the client. conn.Write([]byte("Message received!"))}

通過為每個(gè)連接使用新的 goroutine,多個(gè)客戶端可以同時(shí)連接。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 4:帶有 Gorilla Mux 的 HTTP 服務(wù)器

Gorilla Mux 庫簡(jiǎn)化了 HTTP 請(qǐng)求路由。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "fmt" "github.com/gorilla/mux" "net/http")func main() { // Create a new router. r := mux.NewRouter() // Register a handler function for the root path. r.HandleFunc("/", homeHandler) http.ListenAndServe(":8080", r)}func homeHandler(w http.ResponseWriter, r *http.Request) { // Respond with a welcome message. fmt.Fprint(w, "Welcome to Home!")}

這段代碼設(shè)置了一個(gè) HTTP 服務(wù)器,并為根路徑定義了一個(gè)處理函數(shù)。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 5:HTTPS 服務(wù)器

實(shí)現(xiàn) HTTPS 服務(wù)器可以確保安全通信。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net/http" "log")func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  // Respond with a message.  w.Write([]byte("Hello, this is an HTTPS server!")) }) // Use the cert.pem and key.pem files to secure the server. log.Fatal(http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil))}

服務(wù)器使用 TLS(傳輸層安全性)來加密通信。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 6:自定義 TCP 協(xié)議

可以使用自定義的 TCP 協(xié)議進(jìn)行專門的通信。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "net" "strings")func main() { // Listen on TCP port 8080. listener, err := net.Listen("tcp", ":8080") if err != nil {  panic(err) } defer listener.Close() for {  // Accept a connection.  conn, err := listener.Accept()  if err != nil {   panic(err)  }  // Handle the connection in a new goroutine.  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection. conn.Read(buffer) // Process custom protocol command. cmd := strings.TrimSpace(string(buffer)) if cmd == "TIME" {  conn.Write([]byte("The current time is: " + time.Now().String())) } else {  conn.Write([]byte("Unknown command")) }}

這段代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的自定義協(xié)議,當(dāng)客戶端發(fā)送命令“TIME”時(shí),它會(huì)回復(fù)當(dāng)前時(shí)間。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 7:使用 Gorilla WebSocket 進(jìn)行 WebSockets

WebSockets 提供了通過單一連接的實(shí)時(shí)全雙工通信。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "github.com/gorilla/websocket" "net/http")var upgrader = websocket.Upgrader{ ReadBufferSize:  1024, WriteBufferSize: 1024,}func handler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil {  http.Error(w, "Could not open websocket connection", http.StatusBadRequest)  return } defer conn.Close() for {  messageType, p, err := conn.ReadMessage()  if err != nil {   return  }  // Echo the message back to the client.  conn.WriteMessage(messageType, p) }}func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

WebSocket 服務(wù)器會(huì)將消息回傳給客戶端。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 8:連接超時(shí)

可以使用 context 包來管理連接超時(shí)。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "context" "fmt" "net" "time")func main() { // Create a context with a timeout of 2 seconds ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() // Dialer using the context dialer := net.Dialer{} conn, err := dialer.DialContext(ctx, "tcp", "localhost:8080") if err != nil {  panic(err) } buffer := make([]byte, 1024) _, err = conn.Read(buffer) if err == nil {  fmt.Println("Received:", string(buffer)) } else {  fmt.Println("Connection error:", err) }}

這段代碼為從連接讀取數(shù)據(jù)設(shè)置了兩秒的截止時(shí)間。9d928資訊網(wǎng)——每日最新資訊28at.com

示例 9:使用 golang.org/x/time/rate 進(jìn)行速率限制

速率限制控制請(qǐng)求的速率。9d928資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "golang.org/x/time/rate" "net/http" "time")// Define a rate limiter allowing two requests per second with a burst capacity of five.var limiter = rate.NewLimiter(2, 5)func handler(w http.ResponseWriter, r *http.Request) { // Check if request is allowed by the rate limiter. if !limiter.Allow() {  http.Error(w, "Too Many Requests", http.StatusTooManyRequests)  return } w.Write([]byte("Welcome!"))}func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

此示例使用速率限制器,將請(qǐng)求速率限制為每秒兩個(gè)請(qǐng)求,突發(fā)容量為五個(gè)。9d928資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17249-0.htmlGo 語言高級(jí)網(wǎng)絡(luò)編程

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 如何精確控制 asyncio 中并發(fā)運(yùn)行的多個(gè)任務(wù)

下一篇: 如何將Docker的構(gòu)建時(shí)間減少40%

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 6月安卓手機(jī)好評(píng)榜:魅族20 Pro蟬聯(lián)冠軍

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測(cè),收集時(shí)間2023年6月1日至6月30日,僅限國(guó)內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:95%5月份的時(shí)候魅族20 Pro就是
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實(shí)現(xiàn)了一個(gè)流處理程序
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • “又被陳思誠(chéng)騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國(guó)產(chǎn)懸疑電影,成了陳思誠(chéng)的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠(chéng)再度風(fēng)頭無兩。你可以說陳思誠(chéng)的
  • 年輕人的“職場(chǎng)羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場(chǎng),應(yīng)該選擇什么樣的著裝?”近日,在網(wǎng)絡(luò)上,一個(gè)與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級(jí)寫字樓亞洲金
  • AMD的AI芯片轉(zhuǎn)單給三星可能性不大 與臺(tái)積電已合作至2nm制程

    據(jù) DIGITIMES 消息,英偉達(dá) AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產(chǎn)。而半導(dǎo)體業(yè)內(nèi)人士表示,近日傳出 AMD 的 AI 芯片將轉(zhuǎn)單給
  • iQOO 11S評(píng)測(cè):行業(yè)唯一的200W標(biāo)準(zhǔn)版旗艦

    【Techweb評(píng)測(cè)】去年底,iQOO推出了“電競(jìng)旗艦”iQOO 11系列,作為一款性能強(qiáng)機(jī),該機(jī)不僅全球首發(fā)2K 144Hz E6全感屏,搭載了第二代驍龍8平臺(tái)及144Hz電競(jìng)
  • 榮耀Magicbook V 14 2021曙光藍(lán)版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍(lán)版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內(nèi)存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 榮耀Magic4 至臻版 首創(chuàng)智慧隱私通話 強(qiáng)勁影音系統(tǒng)

    2022年第一季度臨近尾聲,在該季度內(nèi),許多品牌陸續(xù)發(fā)布自己的最新產(chǎn)品,讓大家從全新的角度來了解當(dāng)今的手機(jī)技術(shù)。手機(jī)是電子設(shè)備中,更新迭代十分迅速的一款產(chǎn)品,基
Top 主站蜘蛛池模板: 吉林省| 舒兰市| 鄱阳县| 漳州市| 仁怀市| 沂南县| 卢龙县| 扎囊县| 泰州市| 广西| 广饶县| 晋宁县| 开化县| 松潘县| 买车| 靖宇县| 西吉县| 阿图什市| 阿巴嘎旗| 台安县| 商都县| 泰顺县| 上蔡县| 许昌县| 星子县| 龙游县| 湟中县| 资中县| 苍山县| 岚皋县| 米易县| 鸡西市| 喀什市| 江津市| 舞钢市| 深水埗区| 山阳县| 昌图县| 大姚县| 沙田区| 亳州市|