go http服务端和客户端
web工作万式:
1.客户端——>访问www.baidu.com ——> DNS服务器。返回该域名对应的IP地址。
2.客户端——> IP + port ——>访问网页数据。(TCP连接。HTTP协议。)
http和URL:
http超文本传输协议。规定了浏览器访问Web服务器进行数据通信的规则。http(明文)--TLS、SSL -- https(加密)
URL:统—资源定位。在网络环境中唯一定位一个资源数据。浏览器地址栏内容。
http请求包:
请求行:请求方法(空格) 请求文件URL(空格) 协议版本(\r\n)
请求头:语法格式: key: value
空行: \r\n -----代表 http请求头结束。
请求包体:请求方法对应的数据内容。GET方法没有内容!!
http应答包:
1.使用net/http包创建web 服务器
1)注册回调函数。
http.HandleFunc("/itcast", handler)
参1:用户访问文件位置
参2:回调函数名——函数必须是(w http.ResponseWriter, r *http.Request)作为参数。
2)绑定服务器监听地址。
http.ListenAndServe("127.0.0.1:8000", nil)
也是传2个参数,第一个表示监听地址,
第二个参数,表示回调函数, 如果传nil,则会调用默认的回调函数
2.回调函数:
本质:函数指针。通过地址,在某—特定位置,调用函数。
在程序中,定义一个函数,但不显示调用。当某一条件满足时,该函数由操作系统自动调用。(底层是多态的实现原理)
服务器代码:
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// w:写回给客户端(浏览器)的数据
// r:从客户端浏览器读到的数据
w.Write([]byte("he1lo wor1d"))
}
//http://localhost:8000/itcast
func main() {
//注册回调函数。该回调函数会在服务器被访问时,自动被调用。
http.HandleFunc("/itcast", handler)
//绑定服务器监听地址
http.ListenAndServe( "127.0.0.1:8000", nil)
}
伪装的客户端代码:
package main
import (
"fmt"
"net"
"os"
)
func errFunc2(err error, info string) {
if err != nil {
fmt.Println(info, err)
//return //返回当前函数调用
//runtime.Goexit() //结束当前go程
os.Exit(1) //将当前进程结束。
}
}
// 装浏览器
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8000")
errFunc2(err, "Dial")
defer conn.Close()
//httpRequest := "GET /itcast HTTP/1.1 \r\nHost:127.0.0.1:8000\r\n\r\n"
httpRequest := "GET /itcast55 HTTP/1.1 \r\nHost:127.0.0.1:8000\r\n\r\n"
conn.Write([]byte(httpRequest))
buf := make([]byte, 4096)
n, _ := conn.Read(buf)
if n == 0 {
return
}
fmt.Printf("|%s| \n", string(buf[:n]))
}
写入自己的博客中才能记得长久