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