网络层(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可看到
end
文章仅做个人学习交流,也许并不完全正确,欢迎指正;