国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

wordpress全站美化東莞網(wǎng)絡(luò)優(yōu)化公司

wordpress全站美化,東莞網(wǎng)絡(luò)優(yōu)化公司,用網(wǎng)站做淘寶客怎么樣,htmi 個(gè)人小網(wǎng)站 模板網(wǎng)絡(luò)編程Go語(yǔ)言網(wǎng)絡(luò)編程相關(guān)APIGo語(yǔ)言網(wǎng)絡(luò)編程架構(gòu)Go語(yǔ)言的網(wǎng)絡(luò)編程實(shí)現(xiàn)基于以下幾個(gè)關(guān)鍵原理:bufiobufio 包的主要功能和使用場(chǎng)景主要類型示例 tcp通信解決粘包粘包和拆包的產(chǎn)生原因解決方法示例 網(wǎng)絡(luò)編程 Go語(yǔ)言網(wǎng)絡(luò)編程相關(guān)API 1.1 net包net.Listen(network, a…
  • 網(wǎng)絡(luò)編程
  • Go語(yǔ)言網(wǎng)絡(luò)編程相關(guān)API
  • Go語(yǔ)言網(wǎng)絡(luò)編程架構(gòu)
  • Go語(yǔ)言的網(wǎng)絡(luò)編程實(shí)現(xiàn)基于以下幾個(gè)關(guān)鍵原理:
  • bufio
  • bufio 包的主要功能和使用場(chǎng)景
  • 主要類型
  • 示例 tcp通信
  • 解決粘包
  • 粘包和拆包的產(chǎn)生原因
  • 解決方法
  • 示例

網(wǎng)絡(luò)編程

Go語(yǔ)言網(wǎng)絡(luò)編程相關(guān)API

1.1 net包net.Listen(network, address string): 創(chuàng)建一個(gè)網(wǎng)絡(luò)監(jiān)聽(tīng)器,等待進(jìn)入的連接。它的第一個(gè)參數(shù)是網(wǎng)絡(luò)類型(如"tcp""udp"等),第二個(gè)參數(shù)是要監(jiān)聽(tīng)的地址。net.Dial(network, address string): 連接到指定的地址,返回一個(gè)連接對(duì)象。net.Conn接口: 提供了與網(wǎng)絡(luò)連接相關(guān)的方法,包括:Read(b []byte) (n int, err error): 從連接中讀取數(shù)據(jù)。Write(b []byte) (n int, err error): 向連接寫(xiě)入數(shù)據(jù)。Close() error: 關(guān)閉連接。net.Listener接口: 用于接受傳入連接的接口,包含方法:Accept() (Conn, error): 接受一個(gè)連接請(qǐng)求。1.2 net/http包http.HandleFunc(pattern string, handler func(ResponseWriter, *Request)): 注冊(cè)處理函數(shù),當(dāng)請(qǐng)求的URL匹配指定模式時(shí),執(zhí)行該處理函數(shù)。http.ListenAndServe(addr string, handler Handler) error: 啟動(dòng)HTTP服務(wù)器并監(jiān)聽(tīng)指定地址上的請(qǐng)求。http.Request結(jié)構(gòu)體: 包含請(qǐng)求的各種信息,如方法、URL、頭部信息等。http.ResponseWriter接口: 用于構(gòu)造HTTP響應(yīng),包含方法來(lái)設(shè)置響應(yīng)頭和寫(xiě)入響應(yīng)體。http.Get(url string): 發(fā)起一個(gè)GET請(qǐng)求并返回響應(yīng)。

Go語(yǔ)言網(wǎng)絡(luò)編程架構(gòu)

Go的網(wǎng)絡(luò)編程架構(gòu)主要基于事件驅(qū)動(dòng)和goroutine的并發(fā)模型。

每當(dāng)一個(gè)新的連接被接受時(shí),服務(wù)器會(huì)為其啟動(dòng)一個(gè)新的goroutine來(lái)處理該連接。

因此,Go語(yǔ)言能夠輕松地處理大量的并發(fā)連接,而無(wú)需使用復(fù)雜的線程管理。

服務(wù)器架構(gòu):

監(jiān)聽(tīng)端口:服務(wù)器通過(guò)net.Listen監(jiān)聽(tīng)指定端口。
接受連接:使用listener.Accept()接收連接。
處理連接:為每個(gè)連接創(chuàng)建goroutine,執(zhí)行自定義的處理邏輯。
關(guān)閉連接:在處理完成后,關(guān)閉連接釋放資源。

客戶端架構(gòu):

創(chuàng)建連接:通過(guò)net.Dial或http.Get創(chuàng)建連接。
發(fā)送請(qǐng)求:向服務(wù)器發(fā)送請(qǐng)求或數(shù)據(jù)。
接收響應(yīng):獲取服務(wù)器的響應(yīng)數(shù)據(jù)。
關(guān)閉連接:處理完成后,關(guān)閉連接。

Go語(yǔ)言的網(wǎng)絡(luò)編程實(shí)現(xiàn)基于以下幾個(gè)關(guān)鍵原理:

Goroutine和通道: Go的并發(fā)模型建立在輕量級(jí)goroutine之上。
每一個(gè)網(wǎng)絡(luò)連接都可以在單獨(dú)的goroutine中處理,這樣可以有效利用系統(tǒng)資源,提高并發(fā)處理能力。
通道(channel)用于在多個(gè)goroutine之間傳遞數(shù)據(jù),保證數(shù)據(jù)的安全和同步。

I/O多路復(fù)用: Go使用操作系統(tǒng)的I/O多路復(fù)用機(jī)制,如epoll(Linux)或kqueue(BSD),
來(lái)處理大量連接的讀寫(xiě)事件,從而減少線程上下文切換的開(kāi)銷。

封裝性和易用性: Go的net和net/http包提供了高層次的抽象,簡(jiǎn)化了網(wǎng)絡(luò)編程的復(fù)雜性。
開(kāi)發(fā)者不需要深入底層的socket編程,只需調(diào)用簡(jiǎn)單的API即可實(shí)現(xiàn)復(fù)雜的網(wǎng)絡(luò)操作。

bufio

bufio 是 Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的一個(gè)包,用于提供 buffered I/O(緩沖輸入/輸出)功能。

它通過(guò)對(duì)輸入和輸出操作進(jìn)行緩沖處理,從而提高程序的性能,

減少系統(tǒng)調(diào)用的次數(shù)。bufio 常用于處理文件、網(wǎng)絡(luò)連接等 I/O 操作。

bufio 包的主要功能和使用場(chǎng)景

提高效率:

bufio 使用內(nèi)存中的緩沖區(qū)來(lái)存儲(chǔ)數(shù)據(jù),從而減少直接的系統(tǒng)調(diào)用次數(shù)(如讀寫(xiě)磁盤(pán)或網(wǎng)絡(luò)),提高了讀寫(xiě)效率。

簡(jiǎn)單的接口:

bufio 提供了簡(jiǎn)單易用的接口,讓開(kāi)發(fā)者能夠更方便地處理文本和二進(jìn)制數(shù)據(jù)。

處理文本數(shù)據(jù):

bufio 特別適合處理行或單詞輸入輸出,可以方便地讀取和寫(xiě)入文本數(shù)據(jù)。

主要類型

以下是 bufio 包中幾個(gè)重要的類型:

Reader:bufio.Reader 是一個(gè)結(jié)構(gòu)體,用于緩存輸入。通過(guò) Read() 方法,可以從底層的 io.Reader 中讀取數(shù)據(jù),使用緩沖可以減少調(diào)用次數(shù)。
常用方法:Read(p []byte) (n int, err error): 從緩沖區(qū)讀取數(shù)據(jù)到切片 p 中。ReadString(delim byte) (string, error): 讀取直到遇到分隔符 delim 的數(shù)據(jù),并返回作為字符串。ReadBytes(delim byte) ([]byte, error): 與 ReadString 類似,但返回字節(jié)切片。示例:reader := bufio.NewReader(conn)message, err := reader.ReadString('\n') // 讀取一行數(shù)據(jù)Writer:bufio.Writer 是一個(gè)結(jié)構(gòu)體,用于緩存輸出。可以將數(shù)據(jù)寫(xiě)入緩沖區(qū),并在緩沖區(qū)填滿后再一次性寫(xiě)入到底層的 io.Writer。
常用方法:Write(p []byte) (n int, err error): 將數(shù)據(jù)寫(xiě)入緩沖區(qū)。Flush() error: 將緩沖區(qū)中的數(shù)據(jù)寫(xiě)入到底層的 io.Writer。
示例:writer := bufio.NewWriter(conn)writer.Write([]byte("Hello, Client!\n")) // 寫(xiě)入數(shù)據(jù)到緩沖區(qū)writer.Flush() // 確保將數(shù)據(jù)寫(xiě)入連接Scanner:bufio.Scanner 提供了一個(gè)方便的方式來(lái)逐行讀取輸入,常用于處理文本數(shù)據(jù)。
常用方法:Scan() bool: 讀取下一個(gè) token,返回 true 表示成功。Text() string: 返回上一個(gè) token 作為字符串。
示例:scanner := bufio.NewScanner(os.Stdin)for scanner.Scan() {line := scanner.Text() // 得到輸入的一行fmt.Println(line)}    

示例 tcp通信

這段代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天服務(wù)器,能夠接收并廣播消息到所有連接的客戶端。
使用了 goroutines 來(lái)處理每個(gè)客戶端的連接,
確保服務(wù)器能夠同時(shí)處理多個(gè)連接。
通過(guò) sync.Mutex 來(lái)保護(hù)對(duì)共享數(shù)據(jù)結(jié)構(gòu) clients 的并發(fā)訪問(wèn)。package mainimport ("bufio"      // 導(dǎo)入 bufio 包,用于讀取輸入"fmt"        // 導(dǎo)入 fmt 包,用于格式化輸出"net"        // 導(dǎo)入 net 包,用于網(wǎng)絡(luò)操作"sync"       // 導(dǎo)入 sync 包,用于同步操作
)// 定義全局變量
var (// 保存所有連接的客戶端,使用 map 結(jié)構(gòu)clients    = make(map[net.Conn]bool)clientsMux sync.Mutex // 保護(hù) clients 的并發(fā)訪問(wèn),防止數(shù)據(jù)競(jìng)態(tài)
)func main() {// 監(jiān)聽(tīng)指定的端口(8080)listener, err := net.Listen("tcp", ":8080")if err != nil {// 如果監(jiān)聽(tīng)失敗,打印錯(cuò)誤信息并返回fmt.Println("Error starting server:", err)return}defer listener.Close() // 在 main 函數(shù)結(jié)束時(shí)關(guān)閉監(jiān)聽(tīng)器fmt.Println("Chat server started on :8080") // 服務(wù)器啟動(dòng)成功提示for {// 接受新的連接conn, err := listener.Accept()if err != nil {// 如果接受連接失敗,打印錯(cuò)誤信息并繼續(xù)下一次循環(huán)fmt.Println("Error accepting connection:", err)continue}// 將新客戶端添加到客戶端列表clientsMux.Lock() // 加鎖以保護(hù) clients 的并發(fā)訪問(wèn)clients[conn] = true // 將連接添加到 clientsclientsMux.Unlock() // 解鎖// 啟動(dòng)一個(gè) goroutine 來(lái)處理該連接go handleConnection(conn)}
}// 處理連接的函數(shù)
func handleConnection(conn net.Conn) {defer func() {// 關(guān)閉連接,并從 clients 中移除conn.Close() // 關(guān)閉連接clientsMux.Lock() // 加鎖以保護(hù) clientsdelete(clients, conn) // 從 clients 中移除該連接clientsMux.Unlock() // 解鎖}()// 創(chuàng)建一個(gè)讀取器reader := bufio.NewReader(conn)for {// 讀取客戶端發(fā)送的消息直到換行符message, err := reader.ReadString('\n')if err != nil {// 如果讀取失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading from connection:", err)return}// 打印接收到的消息fmt.Printf("Received: %s", message)// 廣播消息到所有其他客戶端broadcastMessage(message, conn) // 調(diào)用廣播函數(shù)}
}// 廣播消息給所有連接的客戶端
func broadcastMessage(message string, sender net.Conn) {clientsMux.Lock() // 加鎖以保護(hù) clients 的并發(fā)訪問(wèn)defer clientsMux.Unlock() // 在函數(shù)結(jié)束時(shí)解鎖// 遍歷所有連接的客戶端for client := range clients {// 不向發(fā)送消息的客戶端發(fā)送消息if client != sender {_, _ = client.Write([]byte(message)) // 發(fā)送消息}}
}
這段代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天客戶端,能夠連接到服務(wù)器并發(fā)送消息,同時(shí)也會(huì)接收并顯示服務(wù)器發(fā)來(lái)的消息。
通過(guò) goroutines 來(lái)異步處理接收消息和發(fā)送消息,確保用戶可以一邊發(fā)送消息一邊接收來(lái)自服務(wù)器的消息。
使用 bufio.Scanner 和 bufio.Reader 來(lái)處理輸入和輸出的讀取。
package mainimport ("bufio" // 導(dǎo)入 bufio 包,用于讀取輸入"fmt"   // 導(dǎo)入 fmt 包,用于格式化輸出"net"   // 導(dǎo)入 net 包,用于網(wǎng)絡(luò)操作"os"    // 導(dǎo)入 os 包,用于與操作系統(tǒng)交互
)func main() {// 連接到聊天服務(wù)器,指定服務(wù)器地址(localhost:8080)conn, err := net.Dial("tcp", "localhost:8080")if err != nil {// 如果連接失敗,打印錯(cuò)誤信息并返回fmt.Println("Error connecting to server:", err)return}defer conn.Close() // 在 main 函數(shù)結(jié)束時(shí)關(guān)閉連接// 啟動(dòng)一個(gè) goroutine 來(lái)讀取服務(wù)器的消息go readMessages(conn)// 從標(biāo)準(zhǔn)輸入讀取消息并發(fā)送給服務(wù)器sendMessages(conn)
}// 從連接中讀取消息
func readMessages(conn net.Conn) {reader := bufio.NewReader(conn) // 創(chuàng)建一個(gè)讀取器for {// 讀取服務(wù)器發(fā)送的消息直到換行符message, err := reader.ReadString('\n')if err != nil {// 如果讀取失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading from server:", err)return}// 打印接收到的消息fmt.Print("Received: ", message)}
}// 發(fā)送消息到服務(wù)器
func sendMessages(conn net.Conn) {scanner := bufio.NewScanner(os.Stdin) // 創(chuàng)建一個(gè)掃描器來(lái)讀取標(biāo)準(zhǔn)輸入fmt.Println("消息發(fā)送中:")                 // 提示用戶開(kāi)始輸入消息for scanner.Scan() {// 從輸入中讀取一行消息message := scanner.Text()// 發(fā)送消息到服務(wù)器,并在結(jié)尾加上換行符_, err := conn.Write([]byte(message + "\n"))if err != nil {// 如果發(fā)送失敗,打印錯(cuò)誤信息并返回fmt.Println("Error sending message:", err)return}}
}

解決粘包

在網(wǎng)絡(luò)編程中,尤其是使用TCP進(jìn)行通信時(shí),常會(huì)遇到“粘包”與“拆包”現(xiàn)象。這是因?yàn)門(mén)CP是一個(gè)流式協(xié)議,

數(shù)據(jù)在傳輸過(guò)程中可能會(huì)被合并成一個(gè)大的數(shù)據(jù)包,或者一個(gè)大的數(shù)據(jù)包可能被分割成多個(gè)小的數(shù)據(jù)包,從而導(dǎo)致接收方無(wú)法正確解析消息。

粘包和拆包的產(chǎn)生原因

粘包:發(fā)送方可能連續(xù)發(fā)送多個(gè)消息,而TCP將這些消息合并為一個(gè)包,接收方收到的數(shù)據(jù)中包含多個(gè)消息。

拆包:發(fā)送方發(fā)送一個(gè)較大的消息,TCP將其分成多個(gè)小包發(fā)送,接收方在一次讀取中只獲取到部分消息。

解決方法

為了防止粘包和拆包現(xiàn)象,通常采用以下幾種策略來(lái)處理:

  1. 使用固定長(zhǎng)度的消息
    在這種方法中,每個(gè)消息都使用固定的字節(jié)長(zhǎng)度來(lái)進(jìn)行編碼。這樣接收方可以根據(jù)固定的長(zhǎng)度來(lái)讀取數(shù)據(jù)。

    優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單。
    缺點(diǎn):不適用于消息長(zhǎng)度不一致的情形,浪費(fèi)帶寬(如果消息較短)。

  2. 使用分隔符
    在每個(gè)消息的末尾加入一個(gè)特定的分隔符,比如換行符、特定字符等,接收方在讀取數(shù)據(jù)時(shí),可以根據(jù)分隔符進(jìn)行解析。

    優(yōu)點(diǎn):可以處理可變長(zhǎng)度的消息。
    缺點(diǎn):需要確保分隔符不會(huì)出現(xiàn)在消息內(nèi)容中。

  3. 消息頭部長(zhǎng)度
    在每個(gè)消息前添加一個(gè)固定大小的頭部,頭部包含消息的長(zhǎng)度信息,接收方首先讀取頭部,獲取消息長(zhǎng)度,再按長(zhǎng)度讀取數(shù)據(jù)。

    優(yōu)點(diǎn):適用于任意長(zhǎng)度的消息。
    缺點(diǎn):稍顯復(fù)雜,需處理頭部。

示例

此代碼實(shí)現(xiàn)了一個(gè)聊天服務(wù)器,能夠接受多個(gè)客戶端連接,

接收消息并將其廣播給所有連接的客戶端。

它通過(guò)使用二進(jìn)制數(shù)據(jù)處理來(lái)確保消息的完整性和準(zhǔn)確性,使用協(xié)程來(lái)并發(fā)處理每個(gè)連接,

確保服務(wù)器在處理多個(gè)客戶端時(shí)的高效性。

通過(guò)使用 sync.Mutex 來(lái)避免對(duì)共享數(shù)據(jù)結(jié)構(gòu) clients 的競(jìng)爭(zhēng)訪問(wèn)。

package mainimport ("encoding/binary" // 導(dǎo)入 encoding/binary 包,用于在網(wǎng)絡(luò)中進(jìn)行字節(jié)序轉(zhuǎn)換"fmt"            // 導(dǎo)入 fmt 包,用于格式化輸出"net"            // 導(dǎo)入 net 包,用于網(wǎng)絡(luò)操作"sync"           // 導(dǎo)入 sync 包,用于同步操作
)// 定義全局變量
var (clients    = make(map[net.Conn]bool) // 用于保存所有連接的客戶端clientsMux sync.Mutex                 // 保護(hù) clients 的并發(fā)訪問(wèn)
)func main() {// 監(jiān)聽(tīng)指定的端口(8080)listener, err := net.Listen("tcp", ":8080")if err != nil {// 如果啟動(dòng)失敗,打印錯(cuò)誤信息并返回fmt.Println("Error starting server:", err)return}defer listener.Close() // 在 main 函數(shù)結(jié)束時(shí)關(guān)閉監(jiān)聽(tīng)器fmt.Println("Chat server started on :8080") // 服務(wù)器啟動(dòng)成功提示for {// 接受新的連接conn, err := listener.Accept()if err != nil {// 如果接受連接失敗,打印錯(cuò)誤信息并繼續(xù)下一次循環(huán)fmt.Println("Error accepting connection:", err)continue}// 將新客戶端添加到客戶端列表clientsMux.Lock() // 加鎖以保護(hù) clients 的并發(fā)訪問(wèn)clients[conn] = true // 將連接添加到 clientsclientsMux.Unlock() // 解鎖// 啟動(dòng)一個(gè) goroutine 來(lái)處理該連接go handleConnection(conn)}
}// 處理連接的函數(shù)
func handleConnection(conn net.Conn) {defer func() {// 關(guān)閉連接,并從 clients 中移除conn.Close() // 關(guān)閉連接clientsMux.Lock() // 加鎖以保護(hù) clientsdelete(clients, conn) // 從 clients 中移除該連接clientsMux.Unlock() // 解鎖}()for {// 讀取消息長(zhǎng)度(前4個(gè)字節(jié))lengthBuffer := make([]byte, 4) // 創(chuàng)建一個(gè)4字節(jié)的緩沖區(qū)_, err := conn.Read(lengthBuffer) // 從連接中讀取消息長(zhǎng)度if err != nil {// 如果讀取長(zhǎng)度失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading length:", err)return}// 根據(jù)讀取到的長(zhǎng)度轉(zhuǎn)換成整型msgLength := int(binary.BigEndian.Uint32(lengthBuffer))messageBuffer := make([]byte, msgLength) // 根據(jù)長(zhǎng)度創(chuàng)建消息緩沖區(qū)// 讀取消息/* @param messageBuffer 接收消息的緩沖區(qū) @param conn 客戶端連接 @return 返回讀取的字節(jié)數(shù)和錯(cuò)誤信息*/_, err = conn.Read(messageBuffer) // 從連接中讀取消息if err != nil {// 如果讀取消息失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading message:", err)return}// 打印接收到的消息fmt.Printf("Received message: %s\n", string(messageBuffer))// 將接收到的消息廣播給所有其他客戶端broadcastMessage(messageBuffer, conn)}
}// 廣播消息給所有連接的客戶端
func broadcastMessage(message []byte, sender net.Conn) {clientsMux.Lock() // 加鎖以保護(hù) clients 的并發(fā)訪問(wèn)defer clientsMux.Unlock() // 在函數(shù)結(jié)束時(shí)解鎖// 獲取消息長(zhǎng)度msgLength := uint32(len(message))lengthBuffer := make([]byte, 4) // 創(chuàng)建一個(gè)4字節(jié)的緩沖區(qū)binary.BigEndian.PutUint32(lengthBuffer, msgLength) // 將消息長(zhǎng)度轉(zhuǎn)換為大端字節(jié)序// 遍歷所有連接的客戶端for client := range clients {// 不向發(fā)送者發(fā)送消息if client != sender {// 首先發(fā)送消息長(zhǎng)度_, _ = client.Write(lengthBuffer) // 發(fā)送長(zhǎng)度_, _ = client.Write(message) // 然后發(fā)送消息}}
}

此代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天客戶端,能夠連接到服務(wù)器、發(fā)送消息并接收服務(wù)器的消息。
通過(guò)二進(jìn)制傳輸消息長(zhǎng)度,確保了消息的完整性。


package mainimport ("bufio"      // 導(dǎo)入 bufio 包,用于讀取輸入"encoding/binary" // 導(dǎo)入 encoding/binary 包,用于字節(jié)序轉(zhuǎn)換"fmt"        // 導(dǎo)入 fmt 包,用于格式化輸出"net"        // 導(dǎo)入 net 包,用于網(wǎng)絡(luò)操作"os"         // 導(dǎo)入 os 包,用于與操作系統(tǒng)交互
)func main() {// 連接到聊天服務(wù)器,指定服務(wù)器地址(localhost:8080)conn, err := net.Dial("tcp", "localhost:8080")if err != nil {// 如果連接失敗,打印錯(cuò)誤信息并返回fmt.Println("Error connecting to server:", err)return}defer conn.Close() // 在 main 函數(shù)結(jié)束時(shí)關(guān)閉連接// 啟動(dòng)一個(gè) goroutine 來(lái)讀取服務(wù)器的消息go readMessages(conn)// 從標(biāo)準(zhǔn)輸入讀取消息并發(fā)送給服務(wù)器sendMessages(conn)
}// 從連接中讀取消息的函數(shù)
func readMessages(conn net.Conn) {for {// 創(chuàng)建一個(gè)4字節(jié)的緩沖區(qū)用于讀取消息長(zhǎng)度lengthBuffer := make([]byte, 4)_, err := conn.Read(lengthBuffer) // 從連接中讀取消息長(zhǎng)度if err != nil {// 如果讀取長(zhǎng)度失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading length:", err)return}// 將讀取到的長(zhǎng)度轉(zhuǎn)換為整型msgLength := int(binary.BigEndian.Uint32(lengthBuffer))messageBuffer := make([]byte, msgLength) // 根據(jù)長(zhǎng)度創(chuàng)建消息緩沖區(qū)_, err = conn.Read(messageBuffer) // 從連接中讀取消息if err != nil {// 如果讀取消息失敗,打印錯(cuò)誤信息并返回fmt.Println("Error reading message:", err)return}// 打印接收到的消息fmt.Printf("Received message: %s\n", string(messageBuffer))}
}// 發(fā)送消息到服務(wù)器的函數(shù)
func sendMessages(conn net.Conn) {scanner := bufio.NewScanner(os.Stdin) // 創(chuàng)建一個(gè)掃描器來(lái)讀取標(biāo)準(zhǔn)輸入fmt.Println("Type your messages below (end with Enter):") // 提示用戶開(kāi)始輸入消息for scanner.Scan() {// 從輸入中讀取一行消息message := scanner.Text()// 獲取消息長(zhǎng)度msgLength := uint32(len(message))lengthBuffer := make([]byte, 4) // 創(chuàng)建一個(gè)4字節(jié)的緩沖區(qū)binary.BigEndian.PutUint32(lengthBuffer, msgLength) // 將消息長(zhǎng)度轉(zhuǎn)換為大端字節(jié)序// 先發(fā)送消息長(zhǎng)度_, err := conn.Write(lengthBuffer) // 發(fā)送長(zhǎng)度if err != nil {// 如果發(fā)送失敗,打印錯(cuò)誤信息并返回fmt.Println("Error sending length:", err)return}// 再發(fā)送消息_, err = conn.Write([]byte(message)) // 發(fā)送消息if err != nil {// 如果發(fā)送失敗,打印錯(cuò)誤信息并返回fmt.Println("Error sending message:", err)return}}
}
http://aloenet.com.cn/news/36680.html

相關(guān)文章:

  • 網(wǎng)站開(kāi)發(fā)和軟件開(kāi)發(fā)有什么區(qū)別2022新聞大事件摘抄
  • 網(wǎng)站建設(shè)漠環(huán)熊掌號(hào)濟(jì)源網(wǎng)絡(luò)推廣
  • 研究生院 網(wǎng)站 建設(shè)新的營(yíng)銷模式有哪些
  • 廣告行業(yè)網(wǎng)站建設(shè)方案網(wǎng)站優(yōu)化塔山雙喜
  • 網(wǎng)站正在建設(shè)中頁(yè)面深圳營(yíng)銷推廣公司
  • 不需要付費(fèi)的網(wǎng)站贛州seo顧問(wèn)
  • 建設(shè)網(wǎng)站平臺(tái)的章程網(wǎng)頁(yè)設(shè)計(jì)與制作個(gè)人網(wǎng)站模板
  • 網(wǎng)站滾動(dòng)效果怎么做對(duì)網(wǎng)絡(luò)營(yíng)銷的認(rèn)識(shí)800字
  • wordpress后臺(tái)地址河北百度seo點(diǎn)擊軟件
  • 模板網(wǎng)站建設(shè)報(bào)價(jià)網(wǎng)絡(luò)營(yíng)銷比較常用的營(yíng)銷模式
  • 如何建設(shè)一個(gè)電影網(wǎng)站在線播放惡意點(diǎn)擊軟件哪個(gè)好
  • 安慶網(wǎng)站建設(shè)服務(wù)網(wǎng)蘇州關(guān)鍵詞搜索排名
  • 唐山醫(yī)療網(wǎng)站建設(shè)銷售平臺(tái)排名
  • 網(wǎng)站排名優(yōu)化在線培訓(xùn)百度云網(wǎng)盤(pán)網(wǎng)頁(yè)版登錄
  • 做外貿(mào)網(wǎng)哪些網(wǎng)站免費(fèi)代運(yùn)營(yíng)公司排行榜
  • 寧波北侖網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷和網(wǎng)絡(luò)推廣有什么區(qū)別
  • 玉環(huán)做企業(yè)網(wǎng)站百度學(xué)術(shù)搜索
  • 如何做免費(fèi)域名網(wǎng)站高級(jí)搜索引擎
  • 學(xué)校的二級(jí)網(wǎng)站怎么建設(shè)黑河seo
  • 網(wǎng)站鏈接做投票找個(gè)免費(fèi)的網(wǎng)站
  • 網(wǎng)站建設(shè)銷售培訓(xùn)語(yǔ)域名查詢ip138
  • 體驗(yàn)營(yíng)銷seo基礎(chǔ)優(yōu)化包括哪些內(nèi)容
  • 公司宣傳片ppt模板西安網(wǎng)絡(luò)優(yōu)化大的公司
  • wordpress網(wǎng)易云插件百度seo查詢收錄查詢
  • 俄羅斯做貨代的網(wǎng)站公司網(wǎng)站設(shè)計(jì)哪家好
  • 創(chuàng)建網(wǎng)站要多少錢(qián)seo競(jìng)價(jià)排名
  • 江門(mén)住房城鄉(xiāng)建設(shè)廳網(wǎng)站列舉常見(jiàn)的網(wǎng)絡(luò)營(yíng)銷工具
  • 做五金建材這幾個(gè)網(wǎng)站手機(jī)百度高級(jí)搜索
  • 代做廣聯(lián)達(dá) 的網(wǎng)站淺議網(wǎng)絡(luò)營(yíng)銷論文
  • 鹽田區(qū)網(wǎng)站建設(shè)百度網(wǎng)站ip地址