golang套接字的實(shí)現(xiàn)
在 Go 語(yǔ)言中,使用標(biāo)準(zhǔn)庫(kù) net
來(lái)實(shí)現(xiàn)套接字編程。以下是有關(guān) Go 套接字的基本概念和示例。
1. 基本概念
- 網(wǎng)絡(luò)類型:
- TCP:流套接字,提供可靠的、面向連接的通信。
- UDP:數(shù)據(jù)報(bào)套接字,無(wú)連接,適用于快速傳輸。
2. TCP 套接字示例
服務(wù)器端代碼
package main import ( "fmt" "net" ) func main() { // 創(chuàng)建 TCP 套接字 listener, err := net.Listen("tcp", ":12345") if err != nil { fmt.Println("Error starting server:", err) return } defer listener.Close() fmt.Println("Waiting for a connection...") for { // 接受連接 conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } fmt.Println("Connection established from", conn.RemoteAddr()) // 處理連接 go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() message := "Hello, Client!" conn.Write([]byte(message)) fmt.Println("Message sent to client:", message) }
客戶端代碼
package main import ( "fmt" "net" ) func main() { // 連接到服務(wù)器 conn, err := net.Dial("tcp", "localhost:12345") if err != nil { fmt.Println("Error connecting to server:", err) return } defer conn.Close() // 接收數(shù)據(jù) buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading from server:", err) return } fmt.Println("Received message from server:", string(buffer[:n])) }
3. UDP 套接字示例
服務(wù)器端代碼
package main import ( "fmt" "net" ) func main() { // 創(chuàng)建 UDP 套接字 address, err := net.ResolveUDPAddr("udp", ":12345") if err != nil { fmt.Println("Error resolving address:", err) return } conn, err := net.ListenUDP("udp", address) if err != nil { fmt.Println("Error listening:", err) return } defer conn.Close() fmt.Println("Waiting for a connection...") for { buffer := make([]byte, 1024) n, addr, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("Error reading from UDP:", err) continue } fmt.Println("Received message from", addr, ":", string(buffer[:n])) // 發(fā)送響應(yīng) response := []byte("Hello, UDP Client!") conn.WriteToUDP(response, addr) } }
客戶端代碼
package main import ( "fmt" "net" ) func main() { // 發(fā)送 UDP 數(shù)據(jù)包 address, err := net.ResolveUDPAddr("udp", "localhost:12345") if err != nil { fmt.Println("Error resolving address:", err) return } conn, err := net.DialUDP("udp", nil, address) if err != nil { fmt.Println("Error connecting:", err) return } defer conn.Close() message := []byte("Hello, Server!") conn.Write(message) // 接收響應(yīng) buffer := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("Error reading from server:", err) return } fmt.Println("Received message from server:", string(buffer[:n])) }
4. 運(yùn)行示例
- 首先在一個(gè)終端中運(yùn)行服務(wù)器代碼。
- 然后在另一個(gè)終端中運(yùn)行客戶端代碼。
總結(jié)
Go 語(yǔ)言的 net
包使得套接字編程變得簡(jiǎn)單而高效。通過使用 TCP 或 UDP 套接字,你可以輕松實(shí)現(xiàn)網(wǎng)絡(luò)通信。
到此這篇關(guān)于golang套接字的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang套接字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go函數(shù)使用(函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用等)
本文主要介紹了Go函數(shù)使用,包括函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用、可變參數(shù)函數(shù)、匿名函數(shù)、遞歸函數(shù)、高階函數(shù)等,感興趣的可以了解一下2023-11-11深入探討Go語(yǔ)言中的預(yù)防性接口為什么是不必要的
在Go語(yǔ)言中,有一種從其他語(yǔ)言帶來(lái)的常見模式:預(yù)防性接口,雖然這種模式在?Java?等語(yǔ)言中很有價(jià)值,但在Go中往往會(huì)成為反模式,本文我們就來(lái)深入探討一下原因2025-01-01Golang利用channel協(xié)調(diào)協(xié)程的方法詳解
go?當(dāng)中的并發(fā)編程是通過goroutine來(lái)實(shí)現(xiàn)的,利用channel(管道)可以在協(xié)程之間傳遞數(shù)據(jù),所以本文就來(lái)講講Golang如何利用channel協(xié)調(diào)協(xié)程吧2023-05-05Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解
這篇文章主要為大家介紹了Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過程
Go語(yǔ)言是Google的開源編程語(yǔ)言,廣泛應(yīng)用于云計(jì)算、分布式系統(tǒng)開發(fā)等領(lǐng)域,在Linux上也有大量的應(yīng)用場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-11-11Go語(yǔ)言到底有沒有引用傳參(對(duì)比 C++ )
這篇文章主要介紹了Go 到底有沒有引用傳參(對(duì)比 C++ ),需要的朋友可以參考下2017-09-09