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]))
}

posted @ 2022-03-17 00:35  ty1539  阅读(212)  评论(0编辑  收藏  举报