Go语言进阶第09天(HTTP请求与WEB服务器)

1.获取HTTP请求服务器

package main

import (
	"fmt"
	"net"
	"os"
)

func errFunc(err error, info string) {
    
    
	if err != nil {
    
    
		fmt.Println(info, err)
		//return					// 返回当前函数调用
		//runtime.Goexit()			// 结束当前go程
		os.Exit(1) // 将当前进程结束。
	}
}

func main01() {
    
    

	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	errFunc(err, "net.Listen err:")
	defer listener.Close()

	conn, err := listener.Accept()
	errFunc(err, "Accpet err:")
	defer conn.Close()

	buf := make([]byte, 4096)
	n, err := conn.Read(buf)
	if n == 0 {
    
    
		return
	}
	errFunc(err, "conn.Read")

	fmt.Printf("|%s|\n", string(buf[:n]))
}

2.http应答包-服务器返回包

package main

import (
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    
    
	// w:写回给客户端(浏览器)的数据
	// r: 从 客户端 浏览器 读到的数据
	w.Write([]byte("hello 9fud9fd9"))
}

func main03() {
    
    
	// 注册回调函数。 该回调函数会在服务器被访问时,自动被调用。
	http.HandleFunc("/itcast", handler)

	// 绑定服务器监听地址
	http.ListenAndServe("127.0.0.1:8000", nil)
}

3.http应答包-客户端发送包

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 main04() {
    
    
	conn, err := net.Dial("tcp", "127.0.0.1:8000")
	errFunc2(err, "Dial")
	defer conn.Close()

	httpRequest := "GET /itcast88 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]))

}

4.GO简易消息返回服务器

package main

import (
	"fmt"
	"net/http"
)

func myHandle(w http.ResponseWriter, r *http.Request) {
    
    
	// w : 写给客户端的数据内容
	w.Write([]byte("this is a Web server"))

	// r: 从客户端读到的内容
	fmt.Println("Header:", r.Header)
	fmt.Println("URL:", r.URL)
	fmt.Println("Method:", r.Method)
	fmt.Println("Host:", r.Host)
	fmt.Println("RemoteAddr:", r.RemoteAddr)
	fmt.Println("Body:", r.Body)
}

func main05() {
    
    
	// 注册回调函数, 该函数在客户端访问服务器时,会自动被调用
	//http.HandleFunc("/itcast", myHandle)
	http.HandleFunc("/", myHandle)

	// 绑定服务器监听地址
	http.ListenAndServe("127.0.0.1:8000", nil)
}

5.GO搭建简易WEB服务器

package main

import (
	"fmt"
	"net/http"
	"net/url"
	"os"
)

func OpenSendFile(fNmae string, w http.ResponseWriter) {
    
    
	pathFileName := "D:/功能/vscode/项目/HTML工作台/兰公子的主页/故梦的家" + fNmae
	f, err := os.Open(pathFileName)
	if err != nil {
    
    
		fmt.Println("Open err:", err)
		w.Write([]byte(" No such file or directory !"))
		return
	}
	defer f.Close()

	buf := make([]byte, 4096)
	for {
    
    
		n, _ := f.Read(buf) // 从本地将文件内容读取。
		if n == 0 {
    
    
			return
		}
		w.Write(buf[:n]) // 写到 客户端(浏览器)上
	}
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    
    
	fmt.Println("客户端请求:", r.URL)
	URL, err := url.QueryUnescape(r.URL.String())
	if err != nil {
    
    
		fmt.Println(err)
		return
	}
	fmt.Println("客户端请求:", URL)
	OpenSendFile(URL, w)
}

func main() {
    
    
	// 注册回调函数
	http.HandleFunc("/", myHandler)
	// 绑定监听地址
	http.ListenAndServe("127.0.0.1:8000", nil)
}

6.客户端针对服务端构造数据包

package main

import (
	"fmt"
	"io"
	"net/http"
)

func main07() {
    
    
	// 使用Get方法获取服务器响应包数据
	//resp, err := http.Get("http://www.baidu.com")
	resp, err := http.Get("http://127.0.0.1:8000/hello")
	if err != nil {
    
    
		fmt.Println("Get err:", err)
		return
	}
	defer resp.Body.Close()

	// 获取服务器端读到的数据
	fmt.Println("Status = ", resp.Status)         // 状态
	fmt.Println("StatusCode = ", resp.StatusCode) // 状态码
	fmt.Println("Header = ", resp.Header)         // 响应头部
	fmt.Println("Body = ", resp.Body)             // 响应包体

	buf := make([]byte, 4096) // 定义切片缓冲区,存读到的内容
	var result string
	// 获取服务器发送的数据包内容
	for {
    
    
		n, err := resp.Body.Read(buf) // 读body中的内容。
		if n == 0 {
    
    
			fmt.Println("--Read finish!")
			break
		}
		if err != nil && err != io.EOF {
    
    
			fmt.Println("resp.Body.Read err:", err)
			return
		}

		result += string(buf[:n]) // 累加读到的数据内容
	}
	// 打印从body中读到的所有内容
	fmt.Println("result = ", result)
}

猜你喜欢

转载自blog.csdn.net/qq_51685718/article/details/127757047
今日推荐