Go語言網絡編程
- Go語言程序
- 服務端
- 客戶端
- Http程序
有關網絡的基本知識我之前的博客介紹的很詳細 這里就不再贅述了 這里主要講解下Go語言網絡編程的語法
網絡基礎
協議
Go語言程序
我們建立一個tcp鏈接的步驟為 socket bind listen accept 但是在Go語言中 我們并不需要前兩步 并且listen 和 accept的結構都嵌入到了 net 網絡包當中 所以說我們只需要調用net包即可
服務端
package mainimport ("fmt""net""strings"
)func dealcoon(coon net.Conn) {// 接收到鏈接之后我們開始接受數據defer coon.Close() // 在這個函數結束的時候 我們關閉鏈接套接字ipaddress := coon.RemoteAddr().String()fmt.Println("新的鏈接已獲得 ip地址為", ipaddress)buf := make([]byte, 1024) // 開辟一個新的緩沖區來接受用戶的數據for { // 阻塞等待用戶發送的數據n, err := coon.Read(buf) // 從鏈接中讀取數據 相當于像buf中寫入數據 n為讀取的長度if err != nil {fmt.Println("conn read error")break} // 讀取失敗 出現了某些問題// 走到這里表示讀取成功 讀取了n個字節的數據 我們進行切片截取 只截取有效數據result := buf[:n]// 如果對方發送了exit 直接退出if "exit" == string(result) {println("收到退出信號 直接退出")return}// 如果是其他的數據 我們將數據大寫之后返回給客戶端coon.Write([]byte(strings.ToUpper(string(result))))}}func main() {// 首先創建一個監聽套接字listener, err := net.Listen("tcp", "127.0.0.1")if err != nil {println("listen error ")return}defer listener.Close()// 因為我們的tcp程序需要不斷的accept新數據 所以說這里要使用一個for循環for {//conn, err := listener.Accept()if err != nil {fmt.Println("accept error")break} // 跑到這里說明我們套接字的listen出現了錯誤// 這里直接分出一個協程去處理其他問題}
}
客戶端
package mainimport ("fmt""log""net"
)func main() {conn, err := net.Dial("tcp", "127.0.0.1")if err != nil {log.Fatal("conn error")} // 鏈接失敗// 到這里就是鏈接成功了for {fmt.Println("請輸入你要發送的數據")buf := make([]byte, 1024)fmt.Scan(&buf)// 向服務器發送數據conn.Write(buf)// 接受服務器的數據并打印出來n, err2 := conn.Read(buf) if err2!= nil {fmt.Println("出現讀取錯誤了") break}// 截取有效長度的字節result := buf[:n] fmt.Println(string(result))}
}
Http程序
有關http協議我之前的博客介紹的很詳細 大家如果想了解可以參考我的這幾篇博客 Http協議詳解
我們寫Http服務端程序時 需要包含 net/http
包
之后的使用方法如下
- 首先我們需要注冊帶有
func(w http.ResponseWriter, r *http.Requests)簽名的函數
- 其中 w 用來給客戶端發送各種數據 r用來獲取各個參數
- 之后我們選擇使用
http.HandleFunc("/go", myHandler)
函數來注冊各個url對應的處理函數 - 最后我們指定ip和端口進行監聽即可 代碼如下
http.ListenAndServe("127.0.0.1:8000", nil)
我們寫Http客戶端程序時 需要包含 net/http
包
這里的步驟就更簡單了
- 直接使用
http.Get("http://127.0.0.1:8000/go")
函數 指定我們需要的url即可
之后就是對于數據業務的處理了 此處省略