服務端
服務端的處理流程
- 監聽端口
- 接收客戶端的鏈接
- 創建goroutine,處理該鏈接
package main import ( "fmt" "net" ) func main() { fmt.Println("start server...") listen, err := net.Listen("tcp", "0.0.0.0:50000") if err != nil { fmt.Println("listen failed, err:", err) return } for { conn, err := listen.Accept()//監聽是否有連接 if err != nil { fmt.Println("accept failed, err:", err) continue } go process(conn)//創建goroutine,處理連接 } } func process(conn net.Conn) { defer conn.Close() for { buf := make([]byte, 512) _, err := conn.Read(buf) if err != nil { fmt.Println("read err:", err) return } fmt.Println("read: ", string(buf)) } }
客服端
客戶端的處理流程
- 建立與服務端的鏈接
- 進行數據收發
- 關閉鏈接
package main import ( "bufio" "fmt" "net" "os" "strings" ) func main() { conn, err := net.Dial("tcp", "localhost:50000") if err != nil { fmt.Println("Error dialing", err.Error()) return } defer conn.Close() inputReader := bufio.NewReader(os.Stdin) for { fmt.Println("請發送信息(退出請輸入Q):") input, _ := inputReader.ReadString('\n') trimmedInput := strings.Trim(input, "\r\n") if trimmedInput == "Q" { return } _, err = conn.Write([]byte(trimmedInput)) if err != nil { return } } }
發送http請求
package main import ( "fmt" "io" "net" ) func main() { conn, err := net.Dial("tcp", "www.baidu.com:80") if err != nil { fmt.Println("Error dialing", err.Error()) return } defer conn.Close() msg := "GET / HTTP/1.1\r\n"//請求首行 msg += "Host: www.baidu.com\r\n"//請求頭部 msg += "Connection: close\r\n"//請求頭部 msg += "\r\n\r\n"//再下面是請求數據,這里沒有攜帶數據 _, err = io.WriteString(conn, msg) if err != nil { fmt.Println("write string failed, ", err) return } buf := make([]byte, 4096) for { count, err := conn.Read(buf) if err != nil { break } fmt.Println(string(buf[0:count])) } }