鄧州網(wǎng)站建設(shè)免費(fèi)廣告推廣
1、概念
網(wǎng)絡(luò)編程:把分布在不同地理區(qū)域的計(jì)算機(jī)與專門的外部設(shè)備用通信線路互連成一個(gè)規(guī)模大、功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計(jì)算機(jī)可以方便地互相傳遞信息、共享數(shù)據(jù)、軟件、數(shù)據(jù)信息等資源。
客戶端(Client)
客戶端是請(qǐng)求服務(wù)的計(jì)算機(jī)或程序,它可以是桌面應(yīng)用、移動(dòng)應(yīng)用或網(wǎng)頁應(yīng)用。客戶端通常負(fù)責(zé)用戶界面的呈現(xiàn)和用戶輸入的處理。用戶通過客戶端向服務(wù)器發(fā)送請(qǐng)求,通常包括想要訪問的數(shù)據(jù)或資源的具體信息。例如,當(dāng)你在瀏覽器中輸入一個(gè)網(wǎng)址時(shí),瀏覽器就是客戶端,它向相應(yīng)的服務(wù)器發(fā)送請(qǐng)求來獲取頁面信息。
服務(wù)器端(Server)
服務(wù)器端是提供服務(wù)的計(jì)算機(jī)或程序,它接收來自客戶端的請(qǐng)求并做出響應(yīng)。服務(wù)器通常負(fù)責(zé)處理數(shù)據(jù)、運(yùn)行業(yè)務(wù)邏輯、存儲(chǔ)數(shù)據(jù)和管理網(wǎng)絡(luò)資源。響應(yīng)可以是所請(qǐng)求的數(shù)據(jù)、處理結(jié)果,或者是其他要求的資源。例如,當(dāng)服務(wù)器接收到來自瀏覽器的請(qǐng)求時(shí),它會(huì)查找相應(yīng)的網(wǎng)頁文件并將其發(fā)送回客戶端。
設(shè)備之間在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)的傳輸/接收數(shù)據(jù)。?
通信兩個(gè)重要的要素:IP + PORT
設(shè)備之間進(jìn)行傳輸?shù)臅r(shí)候,必須遵照一定的規(guī)則 ----> 通信協(xié)議:
TCP協(xié)議:可靠的
1、建立連接:三次握手
2、釋放連接:
UDP協(xié)議:不可靠的?
?
2、TCP編程 -- 創(chuàng)建客戶端
net包
Go語言標(biāo)準(zhǔn)庫文檔中文版 | Go語言中文網(wǎng) | Golang中文社區(qū) | Golang中國(guó)
Dial函數(shù)("net"):
package main import ("fmt""net" // 網(wǎng)絡(luò)包 )func main(){//打印:fmt.Println("客戶端啟動(dòng)中...")//調(diào)用Dial函數(shù):參數(shù):協(xié)議、IP、端口號(hào)conn,err := net.Dial("tcp","127.0.0.1:8888") //協(xié)議、IP、端口號(hào)if err != nil{// 連接失敗fmt.Println("客戶端連接失敗:err:",err)return}fmt.Println("連接成功,conn=",conn) }
3、TCP編程 -- 創(chuàng)建服務(wù)器端
進(jìn)行監(jiān)聽:
Listen函數(shù)("net"):
package main import ("fmt""net" // 網(wǎng)絡(luò)包 )func main(){//打印:fmt.Println("服務(wù)器端啟動(dòng)中...")//進(jìn)行監(jiān)聽:需要指定服務(wù)器端TCP協(xié)議,服務(wù)器端的IP + PORTlisten,err := net.Listen("tcp","127.0.0.1:8888") //協(xié)議、IP、端口號(hào)if err != nil{// 監(jiān)聽失敗fmt.Println("監(jiān)聽失敗:err:",err)return}//監(jiān)聽成功,等待客戶端連接//循環(huán)等待客戶端連接for {conn,err := listen.Accept() // 等待客戶端連接if err!= nil{fmt.Println("客戶端連接失敗:err:",err)return}fmt.Printf("等待連接成功,conn=%v,接收到的客戶端信息: %v \n",conn,conn.RemoteAddr().String())} }
4、TCP編程 -- 連接測(cè)試
運(yùn)行時(shí)注意:需要先啟動(dòng)服務(wù)器端,然后啟動(dòng)客戶端進(jìn)行訪問:
5、TCP編程 -- 發(fā)送終端數(shù)據(jù)
通過客戶端發(fā)送單行數(shù)據(jù),然后退出:
客戶端:package main import ("fmt""net" // 網(wǎng)絡(luò)包"bufio" // 緩沖包"os" // 操作系統(tǒng)包 )func main(){//打印:fmt.Println("客戶端啟動(dòng)中...")//調(diào)用Dial函數(shù):參數(shù):協(xié)議、IP、端口號(hào)conn,err := net.Dial("tcp","127.0.0.1:8888") //協(xié)議、IP、端口號(hào)if err != nil{// 連接失敗fmt.Println("客戶端連接失敗:err:",err)return}fmt.Println("連接成功,conn=",conn)//通過客戶端發(fā)送單行數(shù)據(jù),然后退出:reader := bufio.NewReader(os.Stdin) // 讀取用戶輸入的內(nèi)容//從終端讀取一行用戶輸入,并準(zhǔn)備發(fā)送給服務(wù)器str, err := reader.ReadString('\n') // 讀取用戶輸入的內(nèi)容if err!= nil{fmt.Println("readString err:",err)}//發(fā)送數(shù)據(jù):n,err := conn.Write([]byte(str)) // 發(fā)送數(shù)據(jù)if err!= nil{fmt.Println("conn.Write err:",err)}fmt.Printf("發(fā)送了%d字節(jié)的數(shù)據(jù),并退出\n",n) }
服務(wù)器端:
package main import ("fmt""net" // 網(wǎng)絡(luò)包 )func process(conn net.Conn){defer conn.Close() // 關(guān)閉連接for{//創(chuàng)建一個(gè)切片,用于存儲(chǔ)讀取到的客戶端發(fā)送的數(shù)據(jù)buf := make([]byte,1024)//從conn連接中讀取數(shù)據(jù)n,err := conn.Read(buf) // 讀取數(shù)據(jù)if err!= nil{fmt.Println("conn.Read err:",err)return}//顯示客戶端發(fā)送的內(nèi)容到服務(wù)器端的終端fmt.Print(string(buf[:n])) // 顯示客戶端發(fā)送的內(nèi)容到服務(wù)器端的終端//向客戶端回復(fù)okconn.Write([]byte("ok...\n")) // 回復(fù)客戶端} }func main(){//打印:fmt.Println("服務(wù)器端啟動(dòng)中...")//進(jìn)行監(jiān)聽:需要指定服務(wù)器端TCP協(xié)議,服務(wù)器端的IP + PORTlisten,err := net.Listen("tcp","127.0.0.1:8888") //協(xié)議、IP、端口號(hào)if err != nil{// 監(jiān)聽失敗fmt.Println("監(jiān)聽失敗:err:",err)return}//監(jiān)聽成功,等待客戶端連接//循環(huán)等待客戶端連接for {conn,err := listen.Accept() // 等待客戶端連接if err!= nil{fmt.Println("客戶端連接失敗:err:",err)return}else{fmt.Printf("等待連接成功,conn=%v,接收到的客戶端信息: %v \n",conn,conn.RemoteAddr().String())}//準(zhǔn)備一個(gè)協(xié)程,協(xié)程處理客戶端服務(wù)請(qǐng)求go process(conn) // 協(xié)程處理客戶端服務(wù)請(qǐng)求,不同的客戶端連接,需要不同的協(xié)程處理} }