go语言解析报文 go语言详解

go语言json处理json是一种经常使用的数据格式 , 下面总结一下json的使用
json与struct转换的话struct的属性必须首字母大写 。
当用的多了就会发现一个致命的问题:go默认会将特殊字符转义采用以下方法可以解决:
处理方法1
处理方法2
不管是属性组成的还是Tag组成的json字符串,都可以正常的解析
tag:
json:"-"// 表示不进行序列化
IsOnSalebooljson:"is_on_sale,string" //序列化后转成string
ProductID int64json:"product_id,omitempty"//为零值时忽略
序列化或者反序列化时可以指定类型,支持string,number和boolean
IsOnSalebooljson:"is_on_sale,string"
注意:
正确使用第一个 , 第二个回报错
go语言中像这样的map如何解析成struct?可以先转成json,再反序列化成定义好的结构体
也可以for循环自己处理
Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)三次握手go语言解析报文:
1. 主动发起连接请求端(客户端)go语言解析报文,发送 SYN 标志位,携带数据包、包号
2. 被动接收连接请求端(服务器) , 接收 SYN,回复 ACK,携带应答序列号 。同时,发送SYN标志位,携带数据包、包号
3. 主动发起连接请求端(客户端),接收SYN 标志位,回复 ACK 。
被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )
四次挥手:
1. 主动请求断开连接端(客户端), 发送 FIN标志,携带数据包
2. 被动接受断开连接端(服务器), 发送 ACK标志,携带应答序列号 。—— 半关闭完成 。
3. 被动接受断开连接端(服务器),发送 FIN标志,携带数据包
4. 主动请求断开连接端(客户端),发送 最后一个 ACK标志,携带应答序列号 。—— 发送完成,客户端不会直接退出,等 2MSL时长 。
等 2MSL待目go语言解析报文的:确保服务器 收到最后一个ACK
滑动窗口:
通知对端本地存储数据的 缓冲区容量 。—— write 函数在对端 缓冲区满时,有可能阻塞 。
TCP状态转换:
1. 主动发起连接请求端:
CLOSED —— 发送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)
2. 主动关闭连接请求端:
ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)
—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED
3. 被动建立连接请求端:
CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)
4. 被动断开连接请求端:
ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP状态转换:
netstat -an | findstr端口号
Linux下查看TCP状态转换:
netstat -an | grep端口号
TCP和UDP对比:
TCP: 面向连接的可靠的数据包传递 。针对不稳定的 网络层,完全弥补 。ACK
UDP:无连接不可靠的报文传输 。针对不稳定的 网络层,完全不弥补 。还原网络真实状态 。
优点缺点
TCP:可靠、顺序、稳定系统资源消耗大,程序实现繁复、速度慢
UDP:系统资源消耗?。?程序实现简单、速度快不可靠、无序、不稳定
使用场景:
TCP:大文件、可靠数据传输 。对数据的 稳定性、准确性、一致性要求较高的场合 。
UDP:应用于对数据时效性要求较高的场合 。网络直播、电话会议、视频直播、网络游戏 。
UDP-CS-Server实现流程:
1.创建 udp地址结构 ResolveUDPAddr(“协议”,“IP:port”) —— udpAddr 本质 struct{IP、port}
2.创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) —— udpConn (socket)
3.从客户端读取数据,获取对端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr,err
4.发送数据包给 客户端 udpConn.WriteToUDP("数据" , clientAddr)
UDP-CS-Client实现流程:
1.创建用于通信的 socket 。net.Dial("udp", "服务器IP:port") —— udpConn (socket)
2.以后流程参见 TCP客户端实现源码 。
UDPserver默认就支持并发!
------------------------------------
命令行参数: 在main函数启动时 , 向整个程序传参 。【重点】
语法: go run xxx.goargv1 argv2argv3argv4。。。
xxx.exe:第 0 个参数 。
argv1 :第 1 个参数 。
argv2 :第 2 个参数 。
argv3 :第 3 个参数 。
argv4 :第 4 个参数 。
使用: list := os.Args提取所有命令行参数 。
获取文件属性函数:
os.stat(文件访问绝对路径) —— fileInfo 接口
fileInfo 包含 两个接口 。
Name() 获取文件名 。不带访问路径
Size() 获取文件大小 。
网络文件传输 —— 发送端(客户端)
1.获取命令行参数,得到文件名(带路径)filePathlist := os.Args
2.使用 os.stat() 获取 文件名(不带路径)fileName
3.创建 用于数据传输的 socketnet.Dial("tcp" , “服务器IP port”) —— conn
4.发送文件名(不带路径)给接收端,conn.write()
5.读取 接收端回发“ok”,判断无误 。封装函数 sendFile(filePath, conn) 发送文件内容
6.实现 sendFile(filePath,conn)
1) 只读打开文件 os.Open(filePath)
【go语言解析报文 go语言详解】for {
2) 从文件中读数据f.Read(buf)
3) 将读到的数据写到socket中conn.write(buf[:n])
4)判断读取文件的 结尾 。io.EOF. 跳出循环
}
网络文件传输 —— 接收端(服务器)
1. 创建用于监听的 socket net.Listen() —— listener
2. 借助listener 创建用于 通信的 socket listener.Accpet()—— conn
3. 读取 conn.read() 发送端的 文件名,保存至本地 。
4. 回发 “ok”应答 发送端 。
5. 封装函数 , 接收文件内容 recvFile(文件路径)
1) f = os.Create(带有路径的文件名)
for {
2)从 socket中读取发送端发送的 文件内容。conn.read(buf)
3)将读到的数据 保存至本地文件 f.Write(buf[:n])
4)判断 读取conn 结束, 代表文件传输完成 。n == 0break
}
go语言解析报文的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言详解、go语言解析报文的信息别忘了在本站进行查找喔 。

    推荐阅读