golang_网络协议: TCP/IP协议简介及C/S构架下的服务器端与客户端

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87977345

网络协议

协议:即传输的规则

TCP/IP协议(四层)

在这里插入图片描述

链路层: MAC: 物理地址

网络层: IP : 逻辑地址

传输层: 源端口,目的端口

数据传输过程

在这里插入图片描述

网络通信条件:

  1. 网卡,mac地址(不需要用户处理,ARP协议=>通过ip找mac)
  2. 逻辑地址,ip地址(需要用户指定,为了确定是哪个电脑接收)
  3. 端口(为了确定是哪个程序接收)
    1. 同一个系统,一个程序只能绑定一个端口
    2. 不同系统,同一端口对应的程序可能不一样

在这里插入图片描述

Socket(套接字)

  1. 套接字用于描述IP地址和端口,可以实现不同程序间的数据通信。

    套接字=IP地址+端口号。可以在网络环境中唯一标识一个进程

  2. 在通讯过程中,套接字是成对出现。

  3. 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]))
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87977345