我們一起聊聊網(wǎng)絡(luò)編程
作者:菜園子dz
把分布在不同地理區(qū)域的計(jì)算機(jī)與專門的外部設(shè)備用通信線路互連成一個(gè)規(guī)模大、功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計(jì)算機(jī)可以方便地互相傳遞信息、共享硬件、軟件、數(shù)據(jù)信息等資源。
引入
【1】網(wǎng)絡(luò)編程:
把分布在不同地理區(qū)域的計(jì)算機(jī)與專門的外部設(shè)備用通信線路互連成一個(gè)規(guī)模大、功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計(jì)算機(jī)可以方便地互相傳遞信息、共享硬件、軟件、數(shù)據(jù)信息等資源。
設(shè)備之間在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)的傳輸,發(fā)送/接收數(shù)據(jù)。
【2】通信兩個(gè)重要的要素:IP+PORT
【3】設(shè)備之間進(jìn)行傳輸?shù)臅r(shí)候,必須遵照一定的規(guī)則 ---》通信協(xié)議:
【4】TCP協(xié)議:可靠的
建立連接: 三次握手
釋放連接:四次揮手
【5】UDP協(xié)議:不可靠的
基于TCP協(xié)議的網(wǎng)絡(luò)通信-創(chuàng)建客戶端
【1】調(diào)用Dial函數(shù):(net包下)
【2】代碼:
package main
import (
"fmt"
//所需的網(wǎng)絡(luò)編程全部都在net包下
"net"
)
func main() {
fmt.Println("客戶端啟動(dòng)...")
//調(diào)用Dial函數(shù):參數(shù)需要指定tcp協(xié)議,需要指定服務(wù)器端的IP+PORT
conn,err := net.Dial("tcp","101.201.48.167:80")
if err != nil {
fmt.Println("客戶端連接失?。篹rr:",err)
return
}
fmt.Println("連接成功,conn:",conn)
}
基于TCP協(xié)議的網(wǎng)絡(luò)通信-創(chuàng)建服務(wù)器端
【1】進(jìn)行監(jiān)聽(tīng):(Listen函數(shù)在net包下)
【2】代碼:
package main
import (
"fmt"
"net"
)
func main() {
fmt.Println("服務(wù)端啟動(dòng)了...")
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil {
fmt.Println("監(jiān)聽(tīng)失敗,err:",err)
return
}
for{
conn,err2 := listen.Accept()
if err2 != nil {
fmt.Println("客戶端的等待失敗,err2:",err2)
}else {
fmt.Printf("等待連接成功,con=%v,接收到的客戶端信息:%v \n",conn,conn.RemoteAddr().String())
}
}
}
基于TCP協(xié)議的網(wǎng)絡(luò)通信-處理終端數(shù)據(jù)
【1】客戶端發(fā)送數(shù)據(jù):
package main
import (
"fmt"
//所需的網(wǎng)絡(luò)編程全部都在net包下
"net"
"bufio"
"os"
)
func main() {
fmt.Println("客戶端啟動(dòng)...")
//調(diào)用Dial函數(shù):參數(shù)需要指定tcp協(xié)議,需要指定服務(wù)器端的IP+PORT
conn,err := net.Dial("tcp","127.0.0.1:8888")
if err != nil {
fmt.Println("客戶端連接失敗:err:",err)
return
}
fmt.Println("連接成功,conn:",conn)
//通過(guò)客戶端發(fā)送單行數(shù)據(jù),然后退出:
reader := bufio.NewReader(os.Stdin)
//從終端讀取一行用戶輸入的信息:
str,err := reader.ReadString('\n')
if err != nil {
fmt.Println("終端輸入失敗,err",err)
}
//將str數(shù)據(jù)發(fā)送給服務(wù)器:
n,err := conn.Write([]byte(str))
if err != nil {
fmt.Println("連接失敗,err:",err)
}
fmt.Printf("終端數(shù)據(jù)通過(guò)客戶端發(fā)送成功,一共發(fā)送了%d字節(jié)的數(shù)據(jù),并退出",n)
}
【2】服務(wù)器端接收數(shù)據(jù):
package main
import (
"fmt"
"net"
)
func process(conn net.Conn) {
//連接用完一定要關(guān)閉:
defer conn.Close()
for {
//創(chuàng)建一個(gè)切片,準(zhǔn)備:將讀取的數(shù)據(jù)放入切片
buf := make([]byte, 1024)
//從conn連接中讀取數(shù)據(jù):
n,err := conn.Read(buf)
if err != nil {
return
}
//將讀取內(nèi)容在服務(wù)器端輸出:
fmt.Println(string(buf[0:n]))
}
}
func main() {
fmt.Println("服務(wù)端啟動(dòng)了...")
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil {
fmt.Println("監(jiān)聽(tīng)失敗,err:",err)
return
}
for{
conn,err2 := listen.Accept()
if err2 != nil {
fmt.Println("客戶端的等待失敗,err2:",err2)
}else {
fmt.Printf("等待連接成功,con=%v,接收到的客戶端信息:%v \n",conn,conn.RemoteAddr().String())
}
//準(zhǔn)備一個(gè)協(xié)程,協(xié)程處理客戶端服務(wù)請(qǐng)求:
//不同的客戶端的請(qǐng)求,連接conn不一樣的
go process(conn)
}
}
責(zé)任編輯:武曉燕
來(lái)源:
今日頭條