网络协议

协议:即传输的规则

TCP/IP协议(四层)

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

链路层: MAC: 物理地址

网络层: IP : 逻辑地址

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

数据传输过程

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

网络通信条件:

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

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

Socket(套接字)

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

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

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

  3. socket是应用层和传输层的接口

TCP的C/S构架编程

golang_网络协议: TCP/IP协议简介及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]))
	}
}

相关文章:

  • 2021-09-17
  • 2021-08-03
  • 2021-05-05
  • 2022-12-23
  • 2021-09-07
  • 2022-01-29
  • 2021-09-10
猜你喜欢
  • 2021-12-31
  • 2022-12-23
  • 2021-05-14
  • 2021-08-24
  • 2021-07-07
  • 2021-05-05
  • 2021-11-27
相关资源
相似解决方案