Go语言的网络编程简介

  本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。

  模拟客户端程序发出请求,这里使用 netcat 工具,也就是 nc 命令。

  通过 net 包,我们可以很简单的去写一个 TCP 服务器,代码可读性强。

  那么我们能不能用 Go 语言来模拟客户端,从而连接前面的服务器呢?答案是肯定的。

  我们知道 TCP/IP 协议是传输层协议,主要解决的是数据如何在网络中传输。而 HTTP 是应用层协议,主要解决的是如何包装这些数据。

  下面的七层网络协议图也能看到 HTTP 协议是处于 TCP 的上层,也就是说,HTTP 使用 TCP 来传输其报文数据。

  现在我们写一个基于 TCP 协议的服务器,并能模拟。在这其中,我们需要模拟发送 HTTP 响应头信息,我们可以用 curl -i 命令先来查看一下其他网站的响应头信息。

  go run main.go 启动服务器之后,跳转到 localhost:8080,就能看到网页内容,并且用开发者工具能看到其请求头。

  Go 是通过一个函数 ListenAndServe 来处理这些事情的,这个底层其实这样处理的:初始化一个server 对象,然后调用了 net.Listen(tcp, addr),也就是底层用 TCP 协议搭建了一个服务,然后监控我们设置的端口。

  前面我们已经对 TCP 服务器有点熟悉了,而 HTTP 使用 TCP 来传输其报文数据,接下来看看如何用 net/http 包来实现在其上的 HTTP 层。

  查文档可以发现 http 包下的 ListenAndServe 函数第一个参数是地址,而第二个是 Handler 类型的参数,我们想要显示内容就要在第二个参数下功夫。

  再次查文档,得知 Handler 是一个接口,也就是说只要我们给某一个类型创建 ServeHTTP(ResponseWriter, *Request) 方法,就能符合接口的要求,也就实现了接口。

  上面我们实现的小服务器里,我们无论访问 localhost:8080 还是 localhost:8080/foo 都是一样的页面,这说明我们之前设定的是默认的页面,还没有为特定的路由(route)设置内容。

  路由这些信息实际上就存在 ServeHTTP 函数的第二个参数 *http.Request 中, *http.Request 存放着客户端发送至服务器的请求信息,例如请求链接、请求方法、响应头、消息体等等。

  本文从搭建 TCP 服务器一步步到搭建 HTTP 服务器,展示了 Go 语言网络库的强大,我认为 Go 语言是熟悉网络协议的一个很好的工具。自己从熟悉了拥有各种 feature 的 Swift 语言之后再入门到看似平凡无奇的 Go 语言,经历了从为语言的平庸感到惊讶不解到为其遵循规范和良好的工业语言设计而感到惊叹和兴奋的转变。

  最后希望本文能为有基础的同学理清思路,也能吸引更多同学来学习这门优秀的语言。返回搜狐,查看更多

您可能还会对下面的文章感兴趣: