Go語言實現(xiàn)服務(wù)端消息接收和發(fā)送
本文實例為大家分享了Go實現(xiàn)服務(wù)端消息接收和發(fā)送的具體代碼,供大家參考,具體內(nèi)容如下
一. 服務(wù)端接收數(shù)據(jù)并返回數(shù)據(jù)
服務(wù)端代碼
package main import ( ? ?"net" ? ?"fmt" ) func main() { ? ?//創(chuàng)建TCPAddress變量,指定協(xié)議tcp4,監(jiān)聽本機(jī)8899端口 ? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") ? ?//監(jiān)聽TCPAddress設(shè)定的地址 ? ?lis, _ := net.ListenTCP("tcp4", addr) ? ?fmt.Println("服務(wù)器已啟動") ? ?//阻塞式等待客戶端消息,返回連接對象,用于接收客戶端消息或向客戶端發(fā)送消息 ? ?conn, _ := lis.Accept() ? ?//把數(shù)據(jù)讀取到切片中 ? ?b := make([]byte, 256) ? ?fmt.Println("read之前") ? ?//客戶端沒有發(fā)送數(shù)據(jù)且客戶端對象沒有關(guān)閉,Read()將會阻塞,一旦接收到數(shù)據(jù)就不阻塞 ? ?count, _ := conn.Read(b) ? ?fmt.Println("接收到的數(shù)據(jù):", string(b[:count])) ? ?/* ? ?向客戶端發(fā)送數(shù)據(jù) ? ? */ ? ?conn.Write([]byte("這是服務(wù)器傳遞的數(shù)據(jù)")) ? ?//關(guān)閉連接 ? ?conn.Close() ? ?fmt.Println("服務(wù)器結(jié)束") }
客戶端代碼
package main import ( ? ?"net" ? ?"fmt" ) func main() { ? ?//服務(wù)器端ip和端口 ? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") ? ?//申請連接客戶端 ? ?conn, _ := net.DialTCP("tcp4", nil, addr) ? ?//向服務(wù)端發(fā)送數(shù)據(jù) ? ?count, _ := conn.Write([]byte("客戶端傳遞的數(shù)據(jù)")) ? ?fmt.Println("客戶端向服務(wù)端發(fā)送的數(shù)據(jù)量為:", count) ? ?/* ? ?接收服務(wù)器傳遞回來的數(shù)據(jù) ? ? */ ? ?b := make([]byte, 256) ? ?c, _ := conn.Read(b) ? ?fmt.Println(string(b[:c])) ? ?關(guān)閉連接 ? ?conn.Close() ? ?fmt.Println("客戶端結(jié)束") }
可以在服務(wù)端添加循環(huán),不停接收客戶端發(fā)送來的數(shù)據(jù),服務(wù)端代碼修改如下
package main import ( ? ?"net" ? ?"fmt" ) func main() { ? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") ? ?lis, _ := net.ListenTCP("tcp4", addr) ? ?fmt.Println("服務(wù)器已啟動") ? ?/* ? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對象 ? ? */ ? ?for { ? ? ? conn, _ := lis.Accept() ? ? ? b := make([]byte, 256) ? ? ? count, _ := conn.Read(b) ? ? ? nc := string(b[:count]) ? ? ? fmt.Println("接收到的數(shù)據(jù):", nc) ? ? ? conn.Write([]byte("服務(wù)器:" + nc)) ? ? ? conn.Close() ? ?} ? ?fmt.Println("服務(wù)器結(jié)束") }
客戶端代碼修改如下
package main import ( ? ?"net" ? ?"fmt" ? ?"strconv" ) func main() { ? ?//服務(wù)器端ip和端口 ? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") ? ?//通過循環(huán),模擬發(fā)送五次客戶端請求 ? ?for i := 1; i <= 5; i++ { ? ? ? conn, _ := net.DialTCP("tcp4", nil, addr) ? ? ? conn.Write([]byte("客戶端數(shù)據(jù)" + strconv.Itoa(i))) ? ? ? b := make([]byte, 256) ? ? ? c, _ := conn.Read(b) ? ? ? fmt.Println("第", i, "次服務(wù)器返回的數(shù)據(jù):", string(b[:c])) ? ? ? conn.Close() ? ?} ? ?fmt.Println("客戶端結(jié)束") }
三.并發(fā)訪問
上面代碼的問題是服務(wù)器獲取到客戶端對象后,如果客戶端什么也沒有輸入,其他客戶端無法連接.可以通過結(jié)合goroutine完成并發(fā)訪問
只需要修改server.go,在里面添加goroutine
package main import ( ? ?"net" ? ?"fmt" ) func main() { ? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") ? ?lis, _ := net.ListenTCP("tcp4", addr) ? ?fmt.Println("服務(wù)器已啟動") ? ?/* ? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對象 ? ? */ ? ?for { ? ? ? conn, _ := lis.Accept() ? ? ? go func() { //在此處添加創(chuàng)建go func()即可 ? ? ? ? ?b := make([]byte, 256) ? ? ? ? ?count, _ := conn.Read(b) ? ? ? ? ?nc := string(b[:count]) ? ? ? ? ?fmt.Println("接收到的數(shù)據(jù):", nc) ? ? ? ? ?conn.Write([]byte("服務(wù)器:" + nc)) ? ? ? ? ?conn.Close() ? ? ? }() ? ?} ? ?fmt.Println("服務(wù)器結(jié)束") }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
安裝GoLang環(huán)境和開發(fā)工具的圖文教程
Go是一門由Google開發(fā)的編程語言,GoLand的安裝非常簡單,本文主要介紹了安裝GoLang環(huán)境和開發(fā)工具的圖文教程,具有一定的參考價值,感興趣的可以了解一下2023-09-09