亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

GoLang?socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時進行長度校驗的方法

 更新時間:2024年11月04日 15:52:03   作者:程序員勛勛1  
在GoLang?socket網(wǎng)絡(luò)編程中,為了確保數(shù)據(jù)交互的穩(wěn)定性和安全性,通常會通過傳輸數(shù)據(jù)的長度進行校驗,發(fā)送端首先發(fā)送數(shù)據(jù)長度,然后發(fā)送數(shù)據(jù)本體,接收端則根據(jù)接收到的數(shù)據(jù)長度和數(shù)據(jù)本體進行比較,以此來確認數(shù)據(jù)是否傳輸成功

正常來說,我們發(fā)送和接收數(shù)據(jù)時,是像下面這樣的:

// 發(fā)送端
func main() {
	conn, _ := net.Dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	conn.Write(data)
	fmt.Println("成功發(fā)送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.Listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.Accept()
	data := make([]byte, 1024)
	conn.Read(data)
	fmt.Println("成功接收: ", string(data))
}

運行結(jié)果如下:

這樣看似沒問題,但實際上還是存在著一定的風(fēng)險(如數(shù)據(jù)丟失、解析錯誤…),這時就需要在發(fā)送和接受時對數(shù)據(jù)進行校驗來確保交互的穩(wěn)定性和安全性。

我們通常利用傳輸數(shù)據(jù)的長度來進行校驗,思路如下:發(fā)送端先發(fā)送數(shù)據(jù)長度len1,再發(fā)送數(shù)據(jù)本體。接收端先接收到數(shù)據(jù)長度len1,再接收到數(shù)據(jù)本體,然后將數(shù)據(jù)本體的程度與數(shù)據(jù)長度len1進行比較,若二者相等則確認數(shù)據(jù)傳輸成功。

上代碼

// 發(fā)送端
func main() {
	conn, _ := net.Dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	// 發(fā)送data的長度len1
	len1 := make([]byte, len(data))
	dataLen := uint32(len(data))
	binary.BigEndian.PutUint32(len1[:4], dataLen)
	conn.Write(len1[:4])
	// 發(fā)送data本體
	conn.Write(data)
	fmt.Println("成功發(fā)送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.Listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.Accept()
	// 接收到 data 的長度
	len1:= make([]byte, 1024)
	realLen, _ := conn.Read(len1[:4])
	dataLen := binary.BigEndian.Uint32(len1[:4])// 將 data 的長度由 []byte 轉(zhuǎn)為 uint32
	// 接收到 data
	data := make([]byte, 1024)
	realLen, _ = conn.Read(data[:dataLen])
	// 在這里進行校驗
	if realLen != int(dataLen) {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	fmt.Println("成功接收: ", string(data))
}

這樣,我們就在接收端初步實現(xiàn)了數(shù)據(jù)的校驗。

眾所周知,Read()函數(shù)和Write()函數(shù)都可以實際傳輸了多少長度(字節(jié)),所以我們可以根據(jù)這個來完善一下數(shù)據(jù)的校驗。

思路:在每次傳輸數(shù)據(jù)(Read或Write)時,我們根據(jù)返回的傳輸長度進行判斷。

例如:

realLen, _ := conn.Write(buf[:4])
	if realLen != 4 {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
realLen, _ = conn.Write(data)
	if realLen != int(dataLen) {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}

在我們之前的代碼中完善這個校驗:

// 發(fā)送端
func main() {
	conn, _ := net.Dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	// 發(fā)送data的長度len1
	len1 := make([]byte, len(data))
	dataLen := uint32(len(data))
	binary.BigEndian.PutUint32(len1[:4], dataLen)
	conn.Write(len1[:4])
	// 完善校驗
	if realLen != 4 {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	// 發(fā)送data本體
	conn.Write(data)
	// 完善校驗
	if realLen != int(dataLen) {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	fmt.Println("成功發(fā)送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.Listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.Accept()
	// 接收到 data 的長度
	len1:= make([]byte, 1024)
	realLen, _ := conn.Read(len1[:4])
	dataLen := binary.BigEndian.Uint32(len1[:4])// 將 data 的長度由 []byte 轉(zhuǎn)為 uint32
	// 完善校驗
	if realLen != 4 {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	// 接收到 data
	data := make([]byte, 1024)
	realLen, _ = conn.Read(data[:dataLen])
	// 完善校驗
		if realLen != int(dataLen) {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	// 在這里進行校驗
	if realLen != int(dataLen) {
		fmt.Println("數(shù)據(jù)在傳輸時出現(xiàn)問題")
		return
	}
	fmt.Println("成功接收: ", string(data))
}

這樣,就實現(xiàn)了對數(shù)據(jù)的長度的校驗。

到此這篇關(guān)于GoLang socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時如何進行長度校驗的文章就介紹到這了,更多相關(guān)GoLang socket長度校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在golang中使用Sync.WaitGroup解決等待的問題

    在golang中使用Sync.WaitGroup解決等待的問題

    這篇文章主要介紹了在golang中使用Sync.WaitGroup解決等待的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go語言time.After()的作用

    go語言time.After()的作用

    time.After 是 Go 語言中的一個函數(shù),用于返回一個定時器通道,該通道在指定時間后發(fā)送當前時間,這個功能常用于超時控制和延遲執(zhí)行,本文就來詳細的介紹一下,感興趣的可以了解學(xué)習(xí)
    2024-10-10
  • 關(guān)于升級go1.18的goland問題詳解

    關(guān)于升級go1.18的goland問題詳解

    作為一個go語言程序員,覺得自己有義務(wù)為go新手開一條更簡單便捷的上手之路,下面這篇文章主要給大家介紹了關(guān)于升級go1.18的goland問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • golang interface{}類型轉(zhuǎn)換的實現(xiàn)示例

    golang interface{}類型轉(zhuǎn)換的實現(xiàn)示例

    在Go語言中,類型轉(zhuǎn)換可以通過斷言、顯式、隱式和強制四種方式實現(xiàn),針對interface{}類型轉(zhuǎn)換為float32或float64,需要使用type斷言或reflect包處理,感興趣的可以了解一下
    2024-10-10
  • Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼

    Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼

    這篇文章主要介紹了Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go中的new()和make()函數(shù)區(qū)別及底層原理詳解

    Go中的new()和make()函數(shù)區(qū)別及底層原理詳解

    這篇文章主要為大家介紹了Go中的new()和make()函數(shù)區(qū)別及底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • golang 字符串切片去重實例

    golang 字符串切片去重實例

    這篇文章主要介紹了golang 字符串切片去重實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運行參數(shù)的保存

    服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運行參數(shù)的保存

    這篇文章主要介紹了服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運行參數(shù)的保存,這里針對使用Go語言編寫的Socket服務(wù)器進行實例說明,需要的朋友可以參考下
    2016-03-03
  • intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項目(打包)全過程

    intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項目(打包)全過程

    最近在配置idea開發(fā)go語言時碰到很多問題,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項目(打包)的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 深入了解Go語言中sync.Pool的使用

    深入了解Go語言中sync.Pool的使用

    本文將介紹?Go?語言中的?sync.Pool并發(fā)原語,包括sync.Pool的基本使用方法、使用注意事項等的內(nèi)容,對我們了解Go語言有一定的幫助,需要的可以參考一下
    2023-04-04

最新評論