六、Golang网络编程:Socket和TCP-CS代码实现

协议:

一组规则。要求使用协议的双方,必须严格遵守协议内容。

网络分层架构:

OSI七层模型结构体: 物、数、网、传、会、表、应

TCP/IP 四层模型:数、网、传、应

各层功能:

链路层: 	ARP
	源mac —— 目标mac

	ARP 协议作用: 借助 IP 获取 mac 地址。

网络层:   IP

	源IP —— 目标IP
	
	IP协议的作用: 在 网络环境中唯一标识一台主机。
	
	IP地址本质:2进制数。—— 点分十进制 IP地址 (string)

传输层:   TCP / UDP 

	port —— 在 一台主机上唯一标识一个进程。

应用层:	ftp、http、自定义

	对数据进行封装。 解封装。

数据通信过程:

封装: 应用层 —— 传输层 —— 网络层 —— 链路层	。 没有经过封装的数据,不能在网络环境中传递。

解封装 : 链路层 —— 网络层 —— 传输层 —— 应用层

总结通信过程:

1. mac地址(不需要用户指定)		(ARP 协议)Ip ——> mac

2. IP 地址 (需要用户指定)	—— 确定主机

3. port 端口号 (需要用户指定)	—— 确定程序

	1. 不能使用系统占用的默认端口。	5000+ 端口我们使用 (80802. 65535为端口上限。 

socket: 套接字

网络通信过程中,socket 一定是成对出现的。

网络应用设计模式:

C/S:
	优点:数据传输效率高、协议选择灵活

	缺点:工作量大、安全性构成威胁

B/S:
	优点:开发工作较小、不受平台限制、安全威胁小

	缺点:缓存数据差、协议选择不灵活、

TCP-CS服务器:

1.  创建监听socket  listener := net.Listen("TCP", "IP+port")	IP+port	—— 服务器自己的IP 和 port

2.  启动监听  conn := listener.Accept()  conn 用于 通信的 socket

3.  conn.Read()  

4.  处理使用 数据

5.  conn.Write()

6.  关闭  listener、conn
func main()  {
	// 指定服务器 通信协议、IP地址、port。 创建一个用于监听的 socket
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listener.Close()

	fmt.Println("服务器等待客户端建立连接...")
	// 阻塞监听客户端连接请求, 成功建立连接,返回用于通信的socket
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("listener.Accept() err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("服务器与客户端成功建立连接!!!")
	// 读取客户端发送的数据
	buf := make([]byte, 4096)
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err:", err)
		return
	}
	conn.Write(buf[:n])		// 读多少写多少。原封不动
	// 处理数据—— 打印
	fmt.Println("服务器读到数据:", string(buf[:n]))
}

nc工具环境变量配置

1. 解压 netcat-win32-1.12.zip 文件 到指定目录

2. 拷贝 解压后目录,保存到环境变量: 

	方法:我的电脑-->属性-->高级系统设置-->环境变量-->系统变量中找“path”-->双击它-->新建-->粘贴

3. 启动 cmd 执行 nc 命令 充当客户端测试

4. nc 127.0.01 8000 (注意 IP 和 端口之间是“空格”)

5. 输入 hello socket。 服务器应该能读到并向服务器的屏幕打印 “hello socket”

TCP-CS客户端:

1.  conn, err := net.Dial("TCP", 服务器的IP+port)

2.  写数据给 服务器 conn.Write()

3.  读取服务器回发的 数据 conn.Read()

4.  conn.Close()
func main()  {
	// 指定 服务器 IP + port 创建 通信套接字。
	conn, err := net.Dial("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("net.Dial err:", err)
		return
	}
	defer conn.Close()

	// 主动写数据给服务器
	conn.Write([]byte("Are you Ready?"))

	buf := make([]byte, 4096)
	// 接收服务器回发的数据
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err:", err)
		return
	}
	fmt.Println("服务器回发:", string(buf[:n]))
}

服务器判断关闭:

Read读客户端/服务器,返回 0  ——  对端关闭!

nc 命令发送数据时,默认在结尾自带‘\n’

TCP通信过程:

三次握手:

	1. 主动发起请求端, 发送 SYN 

	2. 被动建立连接请求端 , 应答ACK 同时 发送 SYN

	3. 主动发起请求端,发送应答 ACK

	标志 TCP 三次握手建立完成。 —— server:Accept() 返回 。 	—— client:Dial() 返回。

四次挥手:

	1. 主动关闭连接请求端, 发送 FIN

	2. 被动关闭连接请求端 ,应答 ACK
					标志。半关闭完成。 —— close()
	3. 被动关闭连接请求端 ,发送 FIN

	4.  主动关闭连接请求端,应答 ACK
					标志。四次挥手建立完成。 —— close().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值