網站首頁 編程語言 正文
udp協議
server端
package main import ( "fmt" "net" ) func main() { // 創建監聽 socket, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8080, }) if err != nil { fmt.Println("監聽失敗!", err) return } defer socket.Close() for { // 讀取客戶端傳來的數據 data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("讀取數據失敗!", err) continue } fmt.Println(read, remoteAddr) fmt.Printf("%s\n\n", data) //發送數據,告訴客戶端已收到 senddata := []byte("hello client!") _, err = socket.WriteToUDP(senddata, remoteAddr) if err != nil { return fmt.Println("發送數據失敗!", err) } } }
client端
package main import ( "fmt" "net" ) func main() { // 創建連接 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() // 發送給服務端數據 senddata := []byte("hello server!") _, err = socket.Write(senddata) if err != nil { fmt.Println("發送數據失敗!", err) return } // 接收客戶端的數據 data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil { fmt.Println("讀取數據失敗!", err) return } fmt.Println(read, remoteAddr) fmt.Printf("%s\n", data) }
TCP通訊(基本)
服務端
package main import ( "fmt" "net" ) func main() { //監聽 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大小的緩沖區 n, err1 := conn.Read(buf) if err1 != nil { fmt.Println("err1 = ", err1) return } fmt.Println("buf = ", string(buf[:n])) defer conn.Close() //關閉當前用戶鏈接 }
客戶端
package main import ( "fmt" "net" ) func main() { //主動連接服務器 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer conn.Close() //發送數據 conn.Write([]byte("are u ok?")) }
TCP通訊并發服務器
服務端
package main import ( "fmt" "net" "strings" ) //處理用戶請求 func HandleConn(conn net.Conn) { //函數調用完畢,自動關閉conn defer conn.Close() //獲取客戶端的網絡地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, " conncet sucessful") buf := make([]byte, 2048) for { //讀取用戶數據 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]) { //自己寫的客戶端測試, 發送時,多了2個字符, "\r\n" fmt.Println(addr, " exit") return } //把數據轉換為大寫,再給用戶發送 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { //監聽 listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //接收多個用戶 for { conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } //處理用戶請求, 新建一個協程 go HandleConn(conn) } }
客戶端
package main import ( "fmt" "net" "os" ) func main() { //主動連接服務器 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Dial err = ", err) return } //main調用完畢,關閉連接 defer conn.Close() go func() { //從鍵盤輸入內容,給服務器發送內容 str := make([]byte, 1024) for { n, err := os.Stdin.Read(str) //從鍵盤讀取內容, 放在str if err != nil { fmt.Println("os.Stdin. err = ", err) return } //把輸入的內容給服務器發送 conn.Write(str[:n]) } }() //接收服務器回復的數據 //切片緩沖 buf := make([]byte, 1024) for { n, err := conn.Read(buf) //接收服務器的請求 if err != nil { fmt.Println("conn.Read err = ", err) return } fmt.Println(string(buf[:n])) //打印接收到的內容, 轉換為字符串再打印 } }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/13994712.html
相關推薦
- 2022-10-21 React配置多個代理實現數據請求返回問題_React
- 2022-07-31 Android中View.post和Handler.post的關系_Android
- 2023-01-18 Go語言讀取YAML?配置文件的兩種方式分享_Golang
- 2022-05-25 Flutter?Animation實現縮放和滑動動畫效果_Android
- 2022-05-13 ffmpeg+pyqt5簡單實現一個抽幀可視化小工具
- 2022-11-15 python中sample函數的介紹與使用_python
- 2022-09-10 Python遞歸實現猴子吃桃問題及解析_python
- 2023-02-27 Python?input()函數案例教程_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支