網(wǎng)站首頁 編程語言 正文
udp協(xié)議
server端
package main import ( "fmt" "net" ) func main() { // 創(chuàng)建監(jiān)聽 socket, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8080, }) if err != nil { fmt.Println("監(jiān)聽失敗!", err) return } defer socket.Close() for { // 讀取客戶端傳來的數(shù)據(jù) data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("讀取數(shù)據(jù)失敗!", err) continue } fmt.Println(read, remoteAddr) fmt.Printf("%s\n\n", data) //發(fā)送數(shù)據(jù),告訴客戶端已收到 senddata := []byte("hello client!") _, err = socket.WriteToUDP(senddata, remoteAddr) if err != nil { return fmt.Println("發(fā)送數(shù)據(jù)失敗!", err) } } }
client端
package main import ( "fmt" "net" ) func main() { // 創(chuàng)建連接 socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8080, }) if err != nil { fmt.Println("連接失敗!", err) return } defer socket.Close() // 發(fā)送給服務(wù)端數(shù)據(jù) senddata := []byte("hello server!") _, err = socket.Write(senddata) if err != nil { fmt.Println("發(fā)送數(shù)據(jù)失敗!", err) return } // 接收客戶端的數(shù)據(jù) data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("讀取數(shù)據(jù)失敗!", err) return } fmt.Println(read, remoteAddr) fmt.Printf("%s\n", data) }
TCP通訊(基本)
服務(wù)端
package main import ( "fmt" "net" ) func main() { //監(jiān)聽 listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //阻塞等待用戶鏈接 conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } //接收用戶的請求 buf := make([]byte, 1024) //1024大小的緩沖區(qū) n, err1 := conn.Read(buf) if err1 != nil { fmt.Println("err1 = ", err1) return } fmt.Println("buf = ", string(buf[:n])) defer conn.Close() //關(guān)閉當(dāng)前用戶鏈接 }
客戶端
package main import ( "fmt" "net" ) func main() { //主動(dòng)連接服務(wù)器 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer conn.Close() //發(fā)送數(shù)據(jù) conn.Write([]byte("are u ok?")) }
TCP通訊并發(fā)服務(wù)器
服務(wù)端
package main import ( "fmt" "net" "strings" ) //處理用戶請求 func HandleConn(conn net.Conn) { //函數(shù)調(diào)用完畢,自動(dòng)關(guān)閉conn defer conn.Close() //獲取客戶端的網(wǎng)絡(luò)地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, " conncet sucessful") buf := make([]byte, 2048) for { //讀取用戶數(shù)據(jù) n, err := conn.Read(buf) if err != nil { fmt.Println("err = ", err) return } fmt.Printf("[%s]: %s\n", addr, string(buf[:n])) fmt.Println("len = ", len(string(buf[:n]))) //if "exit" == string(buf[:n-1]) { //nc測試 if "exit" == string(buf[:n-2]) { //自己寫的客戶端測試, 發(fā)送時(shí),多了2個(gè)字符, "\r\n" fmt.Println(addr, " exit") return } //把數(shù)據(jù)轉(zhuǎn)換為大寫,再給用戶發(fā)送 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { //監(jiān)聽 listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //接收多個(gè)用戶 for { conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } //處理用戶請求, 新建一個(gè)協(xié)程 go HandleConn(conn) } }
客戶端
package main import ( "fmt" "net" "os" ) func main() { //主動(dòng)連接服務(wù)器 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Dial err = ", err) return } //main調(diào)用完畢,關(guān)閉連接 defer conn.Close() go func() { //從鍵盤輸入內(nèi)容,給服務(wù)器發(fā)送內(nèi)容 str := make([]byte, 1024) for { n, err := os.Stdin.Read(str) //從鍵盤讀取內(nèi)容, 放在str if err != nil { fmt.Println("os.Stdin. err = ", err) return } //把輸入的內(nèi)容給服務(wù)器發(fā)送 conn.Write(str[:n]) } }() //接收服務(wù)器回復(fù)的數(shù)據(jù) //切片緩沖 buf := make([]byte, 1024) for { n, err := conn.Read(buf) //接收服務(wù)器的請求 if err != nil { fmt.Println("conn.Read err = ", err) return } fmt.Println(string(buf[:n])) //打印接收到的內(nèi)容, 轉(zhuǎn)換為字符串再打印 } }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/13994712.html
相關(guān)推薦
- 2022-03-23 Asp.Net?Core?使用Monaco?Editor?實(shí)現(xiàn)代碼編輯器功能_實(shí)用技巧
- 2023-01-01 Python交換字典鍵值對的四種方法實(shí)例_python
- 2022-05-17 Python的集合類型之set和frozenset詳解_python
- 2022-07-29 python保存字典數(shù)據(jù)到csv文件的完整代碼_python
- 2022-10-29 關(guān)于torch.load加載預(yù)訓(xùn)練模型時(shí) 造成的 臨時(shí)分配的顯存 不釋放
- 2022-12-24 Docker自定義網(wǎng)絡(luò)詳解_docker
- 2022-04-30 C語言實(shí)現(xiàn)小型工資管理系統(tǒng)_C 語言
- 2022-03-21 golang?調(diào)用c語言動(dòng)態(tài)庫方式實(shí)現(xiàn)_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支