区块链技术基础语言(三十二):Go语言网络编程(下)

本文紧接上文所述,讲解socket编程和HTTP编程。

一、socket编程

在上一节我们介绍了网络体系的五层模型,介绍了每层模型所遵守的协议。TCP/IP是一个协议族,它由网络层的IP协议和传输层的TCP协议组成,其中网络层建立了主机到主机的通信,传输层建立了端口到端口的通信。只要确定主机和端口,就能实现程序之间的交流。因此,Unix系统把主机+端口,叫作“套接字(socket)”,而socket本质上是编程接口(API),它是对TCP/IP的封装。有了它,就可以进行网络应用程序的开发。

 

1.1 网络中进程之间的通信

网络中的每个进程都运行在独立的地址空间,为了保证两个相互通信的进程在互不干扰的前提下协调一致地工作,操作系统需要解决网间进程的标识问题。在网络概述中已经介绍过,ip地址可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序,也就是进程。因此网络中的进程通信可以通过“ip地址+协议+端口”与其它进程进行交互。而TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)。

 

1.2 socket套接字

Socket本质上是编程接口(API),它是对TCP/IP的封装,是应用层和其他层(传输层、网络层、数据链路层)之间的软件抽象层,它将传输层、网络层、数据链路层隐藏在socket接口后面。对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议,让编程变得更简单。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

1.3 TCP的C/S架构

TCP的C/S架构主要分为客户端和服务器端。

服务器端先初始化socket,接着将socket与端口进行绑定(bind),然后对端口进行监听(listen),然后调用accept函数,等待客户端地请求连接。在这时如果有一个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接(close),一次交互结束。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

1.4 示例程序

1.4.1 简单服务器

设计一个服务器程序和客户端程序。启动服务器程序后,再启动客户端程序,客户端的程序连接到服务器程序后,客户端的信息内容会显示在服务器程序。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

1.4.2 简单并发服务器

在1.4.1中启动服务器程序,再运行客户端程序,整个程序就会结束。现在服务器程序设计一个能同时处理多个客户端程序发送的内容。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

二、HTTP编程

2.1 概述

2.1.1 Web工作方式

平时浏览某一网页,我们一般会打开浏览器,输入网址,回车后就可以浏览网址内容。这一简单的操作行为,系统是通过以下步骤实现的:

a. 浏览器是一个客户端,输入URL(统一资源定位符,即网址),浏览器通过请求DNS服务器获取相应的域名所对应的IP;

b. 通过IP地址找到IP对应的服务器,建立TCP连接;

c. 浏览器向服务器发送HTTP Request包,等服务器全部接收到请求包服务器才开始处理请求包,然后服务器向浏览器(客户端)返回HTTP Response(响应)包;

d. 客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容之后,就断开与该服务器之间的TCP连接。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

2.1.2 HTTP服务器工作原理

Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。其工作原理即:

a. 客户机通过TCP/IP协议与服务器建立TCP连接;

b. 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档;

c. 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端;

d. 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。

2.1.3 HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议),是应用层的协议,如表1所示。它是互联网应用中最为广泛的一种网络协议,详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

2.2 HTTP 请求和应答

2.2.1 客户端向服务器请求包

建立一个HTTP服务器,在客户端(浏览器)输入URL,向HTTP服务器发送请求包。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

2.2.2 服务器向客户端发出的应答包

建立一个HTTP服务器和客户端,客户端连接HTTP服务器,服务器向客户端发送应答包。

 

区块链技术基础语言(三十二):Go语言网络编程(下)

 

 

参考资料

[1] studygolang.com/pkgdoc

[2] 88/article/details/65935217