前言
大家可能乍一看,通过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结构体









