Go---网络编程

105 阅读1分钟

网络层(TCP)

server端

package main

import (
	"fmt"
	"net"
)

func main() {
	// 监听本地10000端口
	l, err := net.Listen("tcp", "127.0.0.1:30000")
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	defer l.Close()
	// 等待连接
	c, err2 := l.Accept()
	if err2 != nil {
		fmt.Println("err2:", err2)
		return
	}
	defer c.Close()
	var str [1024]byte
	// 将客户端发来的数据保存在str中
	n, err3 := c.Read(str[:])
	if err3 != nil {
		fmt.Println("err3:", err3)
		return
	}
	fmt.Println("接收客户端消息:", string(str[:n]))
	// 向客户端发送消息
	c.Write([]byte("收到!"))
}


client端

package main

import (
	"fmt"
	"net"
)

func main() {
	// 向本地10000端口拨号
	c, err := net.Dial("tcp", "127.0.0.1:30000")
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	defer c.Close()
	// 向服务器端发送消息
	_, err2 := c.Write([]byte("客户端向服务器端发送数据"))
	if err2 != nil {
		fmt.Println("err2:", err2)
		return
	}
	// 接收客户端发来的消息
	var str [1024]byte
	n, err3 := c.Read(str[:])
	if err3 != nil {
		fmt.Println("err3:", err3)
		return
	}
	fmt.Println("接收服务端消息:", string(str[:n]))
}

结果

PS D:\Go\net\server> go run main.go
接收客户端消息: 客户端向服务器端发送数据
-----------------------------------
PS D:\Go\net\client> go run main.go
接收服务端消息: 收到!

应用层(HTTP)

client端

package main

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

func main() {
	// 向http://www.baidu.com发送get请求
	r, err := http.Get("http://www.baidu.com")
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	// 接收http://www.baidu.com响应的body
	b, err2 := ioutil.ReadAll(r.Body)
	if err2 != nil {
		fmt.Println("err2:", err2)
		return
	}
	// 将http://www.baidu.com的响应存入baidu.html中
	err3 := ioutil.WriteFile("./baidu.html", b, fs.ModeAppend)
	if err3 != nil {
		fmt.Println(err3)
		return
	}
}

client端得到的响应存放到baidu.html中,作为下面的server端的响应。

server端

package main

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

// 处理方法
func h1(resp http.ResponseWriter, req *http.Request) {
        // 读取刚才client端访问baidu.com得到的响应
	b, err2 := ioutil.ReadFile("../httpClient/baidu.html")
	if err2 != nil {
		fmt.Println(err2)
	}
        // 将baidu.html中的内容响应给浏览器
	_, err := resp.Write(b)
	if err != nil {
		fmt.Println("err:", err)
		return
	}
}

func main() {
	// 给/test路径绑定处理方法
	http.HandleFunc("/test", h1)
	// 监听127.0.0.1的40000端口
	err := http.ListenAndServe("127.0.0.1:40000", nil)
	if err != nil {
		fmt.Println("err:", err)
		return
	}
}

打开浏览器,访问127.0.0.1:40000/test可看到

image.png

end

文章仅做个人学习交流,也许并不完全正确,欢迎指正;