Go语言中TCP/IP网络编程的深入讲解

2020-01-28 13:01:56于丽

前言

大家可能乍一看,通过TCP/IP层连接两个进程会感觉可怕, 但是在Go语言中可能比你想象的要简单的多。下面话不多说了,来一起看看详细的介绍吧。

TCP/IP层发送数据的应用场景

当然很多情况下,不是大多数情况下,使用更高级别的网络协议毫无疑问会更好,因为可以使用华丽的API, 它们隐藏了很多技术细节。现在根据不同的需求,有很多选择,比如消息队列协议, gRPC, protobuf, FlatBuffers, RESTful网站API, websocket等等。

然而在一些特殊的场景下,特别是小型项目,选择任何其他方式都会感觉太臃肿了,更不用说你需要引入额外的依赖包了。

幸运的是,使用标准库的net包来创建简单的网络通信不比你所见到的要困难。

因为Go语言中有下面两点简化。

简化1: 连接就是io流

net.Conn接口实现了io.Reader, io.Writer和io.Closer接口。 因此可以像对待其他io流一样对待TCP连接。

你可能会认为:"好,我能在TCP中发送字符串或字节分片,非常不错,但是遇到复杂的数据结构怎么办? 例如我们遇到的是结构体类型的数据?"

简化2: Go语言知道如何有效的解码复杂的类型

当说到通过网络发送编码的结构化数据,首先想到的就是JSON。 不过先稍等一下 - Go语言的标准库encoding/gob包提供了一种序列化和发序列话Go数据类型的方法,它无需给结构体、Go语言不兼容的JSON添加字符串标签, 或者等待使用json.Unmarshal来费劲的将文本解析为二进制数据。

gob编码解码可以直接操作io流,这一点很完美的匹配第一条简化。

下面我们就通过这两条简化规则一起实现一个简单的App。

这个简单APP的目标

这个app应该做两件事情:

发送和接收简单的字符串消息。 通过gob发送和接收结构体。

第一部分,发送简单字符串,将演示无需借助高级协议的情况下,通过TCP/IP网络发送数据是多么简单。

第二部分,稍微深入一点,通过网络发送完整的结构体,这些结构体使用字符串、分片、映射、甚至包含到自身的递归指针。

辛亏有gob包,要做到这些不费吹灰之力。

客户端                                        服务端

待发送结构体                                解码后结构体
testStruct结构体                            testStruct结构体