golang套接字的實(shí)現(xiàn)
在 Go 語言中,使用標(biāo)準(zhǔn)庫 net 來實(shí)現(xiàn)套接字編程。以下是有關(guān) Go 套接字的基本概念和示例。
1. 基本概念
- 網(wǎng)絡(luò)類型:
- TCP:流套接字,提供可靠的、面向連接的通信。
- UDP:數(shù)據(jù)報(bào)套接字,無連接,適用于快速傳輸。
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 語言的 net 包使得套接字編程變得簡單而高效。通過使用 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計(jì)算某段代碼運(yùn)行所耗時(shí)間簡單實(shí)例
這篇文章主要給大家介紹了關(guān)于Go計(jì)算某段代碼運(yùn)行所耗時(shí)間的相關(guān)資料,主要介紹了Golang記錄計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡單方法,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-11-11
詳解Go語言微服務(wù)開發(fā)框架之Go chassis
分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來自己的創(chuàng)新特性。2021-05-05
go local history本地歷史恢復(fù)代碼神器
這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機(jī)器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機(jī)器人實(shí)現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實(shí)現(xiàn)命令行聊天機(jī)器人2023-12-12
golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
golang?gin框架實(shí)現(xiàn)大文件的流式上傳功能
這篇文章主要介紹了golang?gin框架中實(shí)現(xiàn)大文件的流式上傳,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

