socket编程
服务端的处理流程
- a. 监听端口(为什么一般没有,因为默认是80,隐藏了)
- b. 接收客户端的链接
- c. 创建goroutine,处理该链接
客户端的处理流程
- a. 建立与服务端的链接
- b. 进行数据收发
- c. 关闭链接
网络协议
TCP/IP协议
一般默认为4层即可:链路层、网络层、传输层、应用层
链路层:处理MAC地址,设备到设备
网络层:处理IP地址,主机到主机
传输层:处理数据传输,进程到进程
应用层:处理应用,应用程序
层和协议
每一层自己的协议
链路层
ARP:设备到设备(网卡、MAC),通过ip找mac
网络层
ping 172.0.0.1
传输层
TCP:文件传输、安全、慢
UPD:例如聊天相关、不安全、快
复习知识
- 网卡:网卡就是标识,网卡地址—>物理地址(MAC),广播时为了避免广播风暴,根据ip,仅在当前局域网内寻找目的mac地址
打包解包
C/S模型
- 客户机-服务机模型
服务端例子
package main
import (
"fmt"
"net"
)
func main() {
// 监听
listener, err := net.Listen("tcp", "192.0.0.1:8000")
if err != nil {
fmt.Println("err:", err)
}
defer listener.Close()
// 阻塞等待用户链接
conn, err := listener.Accept()
if err != nil {
fmt.Println("err:", err)
return
}
// 接受用户的请求
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("err:", err)
return
}
fmt.Printf("%s", string(buf[:n]))
}
用户端例子
package main
import (
"fmt"
"net"
)
func main() {
// 连接到服务器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err:", err)
return
}
defer conn.Close()
// 发送数据
conn.Write([]byte("Are you ok?"))
}
来源:CSDN
作者:Christ丶李
链接:https://blog.csdn.net/weixin_44879611/article/details/104201577