基本介紹:
網絡編程有兩種:
1)tcp socket編程,是網絡編程的主流。之所以叫tcp socket編程,是因為底層是基於tcp/ip協議的
2)b/s結構的http編程,我們使用瀏覽器去訪問服務器時,使用的就是http協議,而http底層依舊是用tcp socket實現的
tcp socket編程的快速入門:
1.服務端的處理流程
1)監聽接口:8888
2)接收客戶端的tcp鏈接,建立客戶端和服務端的鏈接
3)創建goroutine,處理該鏈接的請求
2.客戶端的處理流程
1)建立與服務端的鏈接
2)發送請求數據,接收服務端返回的結果數據
3)關閉鏈接
服務端代碼:
package main import ( "fmt" "net" ) func process(conn net.Conn) { // 這里循環接收客戶端發送的數據 defer conn.Close() for { // 創建一個新切片 buf := make([]byte, 1024) fmt.Printf("服務器在等待客戶端%s 發送信息\n", conn.RemoteAddr().String()) n, err := conn.Read(buf) // 從conn中讀取 if err != nil { fmt.Printf("客戶端退出 err=%v\n", err) return } fmt.Print(string(buf[:n])) } } func main() { fmt.Println("服務器開始監聽...") listen, err := net.Listen("tcp", "0.0.0.0:8888") if err != nil { fmt.Println("listen err=", err) return } defer listen.Close() // 延時關閉 // 循環等待客戶端來鏈接 for { fmt.Println("等待客戶端來鏈接...") conn, err := listen.Accept() if err != nil { fmt.Println("Accept() err=", err) } else { fmt.Printf("Accept() suc con=%v 客戶端 ip=%v\n", conn, conn.RemoteAddr().String()) } // 這里准備起一個協程,為客戶端服務 go process(conn) } }
客戶端代碼:
package main import ( "bufio" "fmt" "net" "os" "strings" ) func main() { conn, err := net.Dial("tcp", "192.168.2.229:8888") if err != nil { fmt.Println("client dial err=", err) return } // 功能一:客戶端可以發送單行數據,然后退出 reader := bufio.NewReader(os.Stdin) // os.Stdin代表標准輸入 for { // 從終端讀取一行用戶輸入,並准備發送給服務器 line, err := reader.ReadString('\n') if err != nil { fmt.Println("readString err=", err) } line = strings.Trim(line, " \r\n") if line == "exit" { fmt.Println("客戶端退出") return } // 再將line發送給服務器 _, err = conn.Write([]byte(line + "\n")) if err != nil { fmt.Println("conn.Write err=", err) } } //fmt.Printf("客戶端發送了 %d 字節的數據,並退出", n) }