




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章Go网络编程Socket编程01Socket概述Socket概述Socket是用于在计算机网络中两个应用进程间发送和接收数据的端点,其中包含通信协议、目标地址、连接状态等,作为一种网络资源,它本质上就是对传输层协议(TCP/UDP)的运用进行了一层封装,让应用程序能够更方便地使用传输层来传输数据。主流操作系统(Windows/Linux/MacOS等)都提供了统一的套接字抽象编程接口(SocketAPI),开发人员平时编写的网络程序大多处于应用层,它们直接调用SocketAPI接口进行通信,故Socket在网络中所处的位置大致位于应用层的底部、传输层之上(如图所示),起到连接这两层的关键作用。02TCP程序设计1.TCP原理2.TCP编程TCP程序设计1.TCP原理一个典型的TCP传输文件的过程如下:(1)首先启动服务器,一段时间后启动客户端,它与此服务器经过三次握手后建立连接。(2)此后的一段时间内,客户端向服务器发送一个请求,服务器处理这个请求,并为客户端发回一个响应。这个过程一直持续下去,直到客户端向服务器发一个文件结束符,并关闭客户端连接。(3)接着服务器也关闭服务器端的连接,结束运行或等待一个新的客户端连接。以上TCP客户端与TCP服务器间的交互时序如图。TCP程序设计2.TCP编程Go语言TCP编程的通行步骤如下。(1)封装地址用net.ResolveTCPAddr方法封装TCP地址,形式为:地址,错误:=net.ResolveTCPAddr("tcp","主机:端口")返回的“地址”是一个TCPAddr类型的指针。(2)监听地址服务器通过net.ListenTCP方法监听第(1)步封装的TCP地址,等待客户端的请求,语句形式为:监听器,错误:=net.ListenTCP("tcp",地址)这里创建的监听器是*TCPListener类型。(3)发起连接客户端通过net.DialTCP方法向服务器监听的地址发起连接请求,如下:连接,错误:=net.DialTCP("tcp",nil,地址)返回的“连接”是TCPConn类型的指针。TCP程序设计(4)接受连接服务器在循环中用监听器的AcceptTCP方法随时接受到来的连接请求:连接,错误:=监听器.AcceptTCP()这里的“连接”是由监听器创建的用于与客户端Socket连接的结构体,类型也是TCPConn的指针。(5)传输数据接下来的数据传输就在双方连接(TCPConn类型的结构体)对象之间进行,用Read方法接收数据,Write方法发送数据,形如:长度,错误:=连接.Read(数据) //接收数据长度,错误:=连接.Write(数据) //发送数据收发的数据都是字节切片([]byte)类型。TCP程序设计【实例7.1】用TCP实现客户端向服务器上传文本文件。开发步骤如下。(1)实现思路及准备客户端首先将要上传的文件名发给服务器,服务器在自己的资源目录下创建此名称的文本文件;然后客户端将文件内容读取出来发送到服务器端,服务器程序再将传来的内容写入文件即可。本例以D:\Go\下载Go学习资源\2023\08\01下面的“Go语言.txt”文件做测试,服务器资源目录为D:\res\files,需要事先创建好。(2)服务器端开发编写服务器程序代码如下(file-server.go):(3)客户端开发编写客户端程序代码如下(file-client.go):TCP程序设计(4)运行程序先启动服务器程序再启动客户端,在客户端子窗口提示符处输入文件名“Go语言”回车,运行结果如图。此时进入到D:\res\files目录下可看到上传的文件“Go语言.txt”。服务器输出客户端输出03UDP程序设计1.UDP原理2.UDP编程UDP程序设计1.UDP原理UDP(UserDatagramProtocol,用户数据报协议)是一种简单、轻量、无连接的传输协议,可以用在对通信可靠性要求不是很高的场合,如以下几种情形:网络数据大多为短消息。系统拥有大量客户端。对数据安全性无特殊要求。网络负载很重,但对响应速度却要求极高。UDP所收发数据的形式是报文(Datagram),通信时UDP客户端向UDP服务器发送一定长度的请求报文,报文大小的限制与各系统的协议实现有关,但不得超过其下层IP规定的64KB,UDP服务器同样以报文做出应答,如图。UDP程序设计在UDP方式下,客户端并不与服务器建立连接,它只负责调用发送函数向服务器发出数据报。类似地,服务器也不接受客户端的连接,只是调用接收函数被动等待来自某客户端的数据到达。UDP客户端与UDP服务器间的交互时序如图。UDP程序设计UDP与TCP的比较见表。比较项UDPTCP是否连接无连接面向连接传输可靠性不可靠可靠流量控制不提供提供工作方式可以是全双工全双工应用场合少量数据大量数据速度快慢UDP程序设计2.UDP编程Go语言UDP编程的通行步骤如下。(1)封装地址用net.ResolveUDPAddr方法封装UDP地址,形式为:地址,错误:=net.ResolveUDPAddr("udp","主机:端口")返回的“地址”是一个UDPAddr类型的指针。(2)监听地址服务器通过net.ListenUDP方法监听第(1)步封装的UDP地址,语句为:监听器,错误:=net.ListenUDP("udp",地址)(3)建立连接客户端通过net.DialUDP方法与服务器的监听器建立连接,如下:连接,错误:=net.DialUDP("udp",nil,地址)返回的“连接”也是UDPConn类型的指针,它无须经服务器接受,直接就能与服务器端的监听器通信。UDP程序设计(4)收发数据UDP数据的收发在服务器端监听器与客户端连接(两者同为UDPConn类型的结构体)之间进行,用ReadFromUDP方法接收数据,WriteToUDP方法发送数据,形如:长度,地址,错误:=连接.ReadFromUDP(数据) //接收数据连接.WriteToUDP(数据,地址) //发送数据UDP收发的数据也都是字节切片([]byte)类型。【实例7.2】用UDP模拟即时通讯软件(如微信、QQ等)的用户加入群聊时与服务器的交互。开发步骤如下。(1)服务器端开发编写服务器程序代码如下(group-server.go):(2)客户端开发编写客户端程序代码如下(group-client.go):UDP程序设计(3)运行程序先启动服务器程序再启动客户端,在客户端子窗口提示符处输入用户名“周何骏”回车,运行结果如图。服务器输出客户端输出第7章Go网络编程HTTP编程01最简单的HTTP程序最简单的HTTP程序Go语言有net/http包专用于实现HTTP功能,一个最简单的HTTP程序由服务器和客户端两部分组成,客户端向服务器上的复用器发出HTTP请求,复用器根据请求的URL找到预先注册的对应处理器,将请求交给处理器处理,处理器执行程序逻辑得到结果,再将结果写入HTTP响应体后返回给客户端,整个过程如图。最简单的HTTP程序这个过程的Go语言实现方式如下。(1)服务器服务器端需要编写实现一个处理器函数,将这个函数注册到复用器中,然后在指定服务地址上开启监听,等待客户端请求的到来。①实现处理器实现处理器就是编写相应的处理器函数,处理器函数有固定类型的两个参数,写法为:func函数名(参数1http.ResponseWriter,参数2*http.Request){ ...//执行处理逻辑的代码}②注册处理器用户编写的处理器必须注册才能使用,net/http包提供一个HandleFunc函数用于在指定的URL路径上注册处理器,语句写法为:http.HandleFunc(URL路径,函数名)最简单的HTTP程序③开启监听一切准备就绪后,服务器调用ListenAndServe函数开启监听,就可以向客户端提供服务了,语句如下:http.ListenAndServe(地址,nil)如果需要对服务器进行更多配置,可先创建一个http.Server结构体对象,指定对其特定的参数进行初始化,然后再调用ListenAndServe函数,代码形如://配置服务器server:=&http.Server{
参数1:值1,
参数2:值2, ...
参数n:值n,}server.ListenAndServe() //开启监听最简单的HTTP程序(2)客户端客户端需要能创建HTTP请求和解析HTTP响应。①创建HTTP请求Go使用NewRequest函数创建HTTP请求,语句为:请求,错误:=http.NewRequest(方法,URL,请求体)②解析HTTP响应net/http包中提供了一个模拟客户端的Client结构体,通过调用其Do方法来获取一个HTTP请求对应的响应,语句如下:客户端:=&http.Client{}响应,错误:=客户端.Do(请求)Go对最常用的GET和POST请求还做了进一步封装,因此也可以不用模拟客户端而直接通过Get或Post函数获取到响应,例如:响应,错误:=http.Get(URL)最简单的HTTP程序【实例7.3】服务器在收到请求后向客户端返回一句话:
“Hello,我爱Go语言!@easybooks”。开发步骤如下。(1)服务器编写服务器程序代码如下(hello-server.go):packagemainimport( "fmt" "net/http" //Go语言HTTP编程包)//实现处理器funcsayhello(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,我爱Go语言!@easybooks\n") //w.Write([]byte("Hello,我爱Go语言!@easybooks\n")) //也可以用这句}
funcmain(){ http.HandleFunc("/hello",sayhello) //注册处理器 http.ListenAndServe(":8080",nil) //开启监听 //或者用下面这段代码 //server:=&http.Server{ // Addr:":8080", //配置地址参数 //} //server.ListenAndServe()}最简单的HTTP程序(2)客户端编写客户端程序代码如下(hello-client.go):packagemainimport( "fmt" "io/ioutil" "net/http" //Go语言HTTP编程包)
funcmain(){ //创建HTTP请求 req,_:=http.NewRequest("GET",":8080/hello",nil) //解析HTTP响应 client:=&http.Client{} rsp,_:=client.Do(req)
//rsp,_:=http.Get(":8080/hello") //或者用这句替代上面3句 //输出显示响应体中的数据内容 contents,_:=ioutil.ReadAll(rsp.Body) fmt.Println(string(contents))}最简单的HTTP程序(3)运行程序先启动服务器程序再启动客户端,从客户端子窗口中可看到输出,或者通过浏览器访问:8080/hello也能看到同样的输出内容,运行结果如图。客户端输出浏览器输出02使用模板引擎使用模板引擎网页本质上是一个HTML文档,其中大部分内容(如框架、样式、主题、页尾声明等)都是固定不变的,变化的只是业务数据,于是可将不变的部分提取出来作为“模板”,而可变部分则由处理器在运行时提供数据,借助模板引擎渲染来合成动态网页,如图所示。使用模板引擎Go语言内置了文本模板引擎text/template包,开发使用模板引擎的HTTP程序的通行步骤如下。(1)定义模板模板文件通常是.html网页文件,也可以是.tmpl或.tpl后缀的文件,但都必须使用UTF-8编码。用户要按一定的语法规则编写模板内容,基本规则如下:模板中使用“{{”和“}}”来包裹和标识需要传入的数据。传给模板的数据可以通过点号(.)来访问。如果是复合类型的数据,则可以通过“{{.字段名}}”来访问它的字段。除“{{”和“}}”包裹的内容外,其他内容均不做修改原样输出。使用模板引擎(2)解析模板解析模板使用ParseFiles函数,该函数接收模板文件名作为参数,返回一个模板对象(Template)类型的指针,调用语句如下:模板对象,错误:=template.ParseFiles(模板文件)(3)渲染模板最后,通过调用模板对象的Execute方法来渲染模板,语句如下:模板对象.Execute(HTTP响应体,数据)使用模板引擎【实例7.4】使用模板引擎在浏览器中输出一句话:
“Hello,我爱Go语言!@easybooks”。开发步骤如下。(1)定义模板在当前GoLand项目目录下创建模板文件,编写内容如下(hello-view.html):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>我喜爱的编程语言</title><style>.myfont{font-family:"华文楷体";font-size:x-large;font-weight:bold;color:limegreen;}</style></head><body><divclass="myfont">Hello,我爱{{.Language}}语言!@{{.User}}</div></body></html>使用模板引擎(2)解析、渲染模板解析和渲染模板的代码都写在服务器的处理器函数中,如下(hello-template.go):packagemainimport( "net/http" "text/template" //Go语言模板引擎包)typeContentsstruct{ //存储数据的结构体 Languagestring Userstring}//处理器函数funcrenderhello(whttp.ResponseWriter,req*http.Request){ tmpl,_:=template.ParseFiles("./hello-view.html") //解析模板 contents:=Contents{ Language:"Go", User:"easybooks", } //产生数据内容 tmpl.Execute(w,contents) //渲染模板}
funcmain(){ http.HandleFunc("/hello",renderhello) http.ListenAndServe(":8080",nil)}使用模板引擎(3)运行程序启动服务器,通过浏览器访问:8080/hello,运行结果如图。浏览器输出客户端输出03请求多路复用请求多路复用多路复用的HTTP程序工作过程如图。请求多路复用【实例7.5】使用多路复用器分别以中英文输出对Go语言的问候。编写服务器程序代码如下(hello-handle.go):packagemainimport( "fmt" "net/http")typeContentsstruct{ //作为处理器类的结构体 Languagestring Userstring}//处理器的ServeHTTP方法func(cContents)ServeHTTP(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,c.Language)}
funcmain(){ mux:=http.NewServeMux() //创建多路复用器 mux.Handle("/hello/cn",Contents{Language:"您好,我爱Go语言!@易斯\n"}) mux.Handle("/hello/en",Contents{Language:"Hello,IloveGolanguage!@easybooks\n"}) //不同的URL分别定向至不同的处理器实例 server:=&http.Server{ Addr:":8080", Handler:mux, //配置复用器 } server.ListenAndServe()}请求多路复用或者,也可以采用处理器函数的方式来实现多路复用功能,如下(hello-handlefunc.go):packagemainimport( "fmt" "net/http")
funccnHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"您好,我爱Go语言!@易斯\n")} //处理器函数1(输出中文问候语)funcenHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,IloveGolanguage!@easybooks\n")} //处理器函数2(输出英文问候语)
funcmain(){ mux:=http.NewServeMux() //创建多路复用器 //将两个处理器函数注册到复用器中 mux.HandleFunc("/hello/cn",cnHandler) mux.HandleFunc("/hello/en",enHandler) server:=&http.Server{ Addr:":8080", Handler:mux, //配置复用器 } server.ListenAndServe()}请求多路复用以上两个程序的运行方式和结果都是完全一样的。启动服务器,通过浏览器访问:8080/hello/cn,输出中文问候语;访问:8080/hello/en则输出英文问候语,运行结果如图。输出中文问候语输出英文问候语04表单提交处理表单提交处理在HTTP编程中,可从处理器函数的第2个参数(HTTP请求体)中获取页面表单提交的数据,只要执行语句:请求体.ParseForm()即可解析出表单数据,数据是键值对的形式,可用如下语句得到对应键的值:值:=请求体.Form.Get(键名)【实例7.6】在表单中输入编程语言及用户名,提交后用模板显示对该语言的问候。开发步骤如下。(1)定义模板本例复用前面实例已定义好的模板hello-view.html,内容略。表单提交处理(2)开发表单页编写表单页的源码如下(hello-submit.html):<html><head><title>我喜爱的编程语言</title></head><body><formaction="/hello"method="post">
语
言:<inputtype="text"name="language"><br>
用
户:<inputtype="text"name="user"><br>
<inputtype="submit"value="确定"></form></body></html>表单提交处理(3)开发后台程序编写后台服务器的程序代码如下(hello-post.go):(4)运行程序启动服务器,通过浏览器访问:8080/hello,出现表单页,在页面表单中输入语言和用户,单击“确定”按钮提交,转到模板页输出对该语言的问候,运行过程如图。提交表单输出问候第7章Go网络编程Web开发基础01Web程序架构模式1.开发视图2.开发模型和控制器3.运行程序Web程序架构模式传统网站的Web应用程序普遍采用MVC架构模式,它将软件系统分为3个基本部分:模型:定义系统所用的数据结构并封装对数据的处理方法。它可访问数据库,有对数据直接操作的权限。视图:实现Web前端界面,有目的地组织和显示数据。它只关注数据的样式和显示效果而不管其内容的正确性,也不包含处理数据的业务逻辑。控制器:用于控制应用程序的流程、处理与程序业务逻辑相关的数据。它接受客户端的请求、与模型和视图交互并做出响应,在系统不同层面间起到组织协调作用。在Go语言开发的Web程序中,用于页面显示的模板和模板引擎就是视图;复用器及其上注册的诸多处理器一起构成整个系统的控制器部分;而为了存储数据内容所定义的结构体(类)及其操作数据的方法则是模型。Web程序架构模式一个能完整体现MVC架构的典型Go程序的组成结构如图。Web程序架构模式【实例7.7】在MySQL数据库中有一个favlang(爱好语言)表,其中存有一些用户及各自所喜爱的编程语言名,如图。Web程序架构模式1.开发视图(1)定义模板本例依然复用前面实例已定义好的模板hello-view.html,内容略。(2)设计表单页编写表单页的源码如下(hello-query.html):<html><head><title>我喜爱的编程语言</title></head><body><formaction="/hello"method="post">
用
户:<inputtype="text"name="user"><inputtype="submit"value="确定"></form></body></html>Web程序架构模式2.开发模型和控制器本例的模型是一个名为FavLang的结构体(对应数据库favlang表),它有一个getLang方法可获取数据库中给定用户所喜爱的编程语言名;控制器是一个名为langController的处理器函数。模型和控制器部分的代码都写在后台服务器程序中,如下(hello-mvc.go):3.运行程序启动服务器,通过浏览器访问:8080/hello,出现表单页,在页面表单中输入用户名,单击“确定”按钮提交,转到模板页输出此用户对该语言的问候,运行过程如图。提交表单输出问候02Gin框架1.安装Gin框架2.开发视图3.开发模型和路由引擎4.运行程序Gin框架(1)采用路由引擎实现C(控制器)功能路由引擎(gin.Engine)是Gin提供的一种中间件,乃是整个框架的核心,在用Gin框架编写的程序一开始就要通过Default方法创建一个路由引擎的实例,它的作用相当于Go语言HTTP程序中的复用器,可通过不同的请求方法将URL关联到对应的处理器函数,语句如下:路由引擎=gin.Default()路由引擎.方法(URL路径,函数名)这里的“方法”对应GET、POST、PUT、DELETE等HTTP请求方法,“函数名”是需要由用户自定义实现的处理器函数。然后,用Run方法启动路由引擎,相当于开启ListenAndServe监听:路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿户外游戏安全教育
- 学前教育课程改革回顾与展望
- 2025河南省企业劳动合同样本
- 2025电子产品买卖贸易合同
- 版2025私人借款合同范本汇编
- 2025合同编码准则
- 现代教职工心理健康教育
- 2025年上海市股权转让合同范本
- 2025物流配送合同模板
- 家乡旅游文化节庆策划方案
- 《工程科学与技术》论文投稿模板
- 精美乒乓球运动活动策划方案PPT
- GB/T 18050-2000潜油电泵电缆试验方法
- GB 7793-2010中小学校教室采光和照明卫生标准
- FZ/T 24011-2019羊绒机织围巾、披肩
- 金螳螂企业管理课件
- 炊事机械安全操作规程
- 最新版教育心理学课件3-成就动机
- 离合器-汽车毕业设计-设计说明书
- 中国民间美术年画-完整版PPT
- 2022年《趣味接力跑》教案
评论
0/150
提交评论