版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87977345
网络协议
协议:即传输的规则
TCP/IP协议(四层)
链路层: MAC: 物理地址
网络层: IP : 逻辑地址
传输层: 源端口,目的端口
数据传输过程
网络通信条件:
- 网卡,mac地址(不需要用户处理,ARP协议=>通过ip找mac)
- 逻辑地址,ip地址(需要用户指定,为了确定是哪个电脑接收)
- 端口(为了确定是哪个程序接收)
- 同一个系统,一个程序只能绑定一个端口
- 不同系统,同一端口对应的程序可能不一样
Socket(套接字)
-
套接字用于描述IP地址和端口,可以实现不同程序间的数据通信。
套接字=IP地址+端口号。可以在网络环境中唯一标识一个进程
-
在通讯过程中,套接字是成对出现。
-
socket是应用层和传输层的接口
TCP的C/S构架编程
服务器端:
func main() {
//1.创建用于监听的套接字
l, err := net.Listen("tcp","127.0.0.1:8080")
if err != nil {
fmt.Println("建立监听失败err =",err)
return
}
defer l.Close()
//2.创建用于通讯的套接字
conn, err := l.Accept()
if err != nil {
fmt.Println("接受数据失败err =",err)
}
defer conn.Close()
//3.获取客户端发来的信息
buf := make([]byte,1024)
for {
n, err := conn.Read(buf) //从套接字中读取数据存储到切片中
if err != nil {
fmt.Println("读取数据失败err =",err)
return
}
fmt.Println("客户端发来了:",string(buf[:n]))
//处理请求,写入数据
conn.Write([]byte("收到..."))
}
}
客户端:
func main() {
//1.向服务器拨号,创建用于通讯的套接字
conn,err :=net.Dial("tcp","127.0.0.1:8080")
if err != nil{
fmt.Println("连接服务器失败",err)
return
}
defer conn.Close()
//2.将键盘的输入数据写入套接字
buf := make([]byte,1024)
go func() {
for {
n, err := os.Stdin.Read(buf) //从键盘上读取,将数据存放到buffer切片中
if err != nil {
fmt.Println("从键盘读取失败",err)
}
conn.Write(buf[:n]) //将键盘输入的数据写入套接字
}
}()
//3.获取服务器返回的信息
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("读数据失败",err)
}
fmt.Println("服务器回复:",string(buf[:n]))
}
}