Go语言学习之 Day09 网络编程
目录
网络编程
- TCP服务器/客户端开发
- UDP服务器/客户端开发
- 命令行聊天室
web开发
- HTTP协议
- web应用开发
- 客户端开发
Web爬虫
- HTML结构
- Goquery
RPC
网络编程
net包提供了对socket编程的支持,socket编程分服务端和客户端编程,针对服务端可使用函数Listen创建监听服务,对于客户端可使用函数Dial连接服务器
常用函数
- Listen: 用于创建监听服务器
- ListenPacket:用于创建服务器端连接
- Dial:用于创建与服务器连接
- JoinHostPort:连接地址和端口
- SplitHostort:分割地址和端口
- LookupAddr:查找地址对应主机名
- LookupHost: 根据主机名查看地址
- ParseCIDR:解析CIDR格式IP
WEB开发
HTTP(HyperText Transfer Protocol, 超文本传输协议) 是访问互联网使用的核心通信协议,也是所有web应用程序使用的通信协议。
消息模型:客户端发送请求消息,服务器返回响应消息。传输层使用具有状态的TCP协议,但HTTP协议本身不具有状态
HTTP请求
HTTP请求消息分为消息头和消息主体(可选),消息头和消息主体用空白行分隔。实例:
HTTP请求说明:
1.消息头第一行由三个以空格分隔的元素组成,分别为HTTP方法、请求的URL和使用的HTTP版本
HTTP方法;
1). GET:用于获取资源,参数通过URL查下字符串方式提交给服务器,无消息主体
2). POST:用于执行操作,参数可以通过URL查下字符串方式和消息主体提交给服务
3). HEAD:用于检测资源是否存在,与GET类似,区别在于在响应消息中返回的消息主体为空
4). TRACE:用于诊断,可判断客户端和服务器之间是否存在代理服务器,原理:服务器在响应主体中返回收到的请求消息的具体内容
5). OPTIONS:用于要求服务器报告对某一资源有效的HTTP方法,服务器常返回Allow消息头的响应,并列出所有有效的方法6). PUT:使用请求主体中的内容向服务器上传指定的资源
7). DELETE:用于删除资源
8). CONNECT:
请求URL:用于指定请求的资源名称以及查下参数
使用的HTTP版本:常用1.0和1.1版本,在1.1版本中请求消息中必须包含Host请求头
2.其他
Host:指定请求访问的主机名,当多个web站点部署在同一台主机上时需要使用Host消息头
User-Agent:指定客户端软件的信息,不如浏览器类型和版本、操作系统类型和版本等
Referer:表示发出请求的原始URL
Cookie:提交服务器想客户端发布的其他参数
HTTP 响应
HTTP响应消息分为消息头和消息主体(可选),消息头和消息主体用空白行分隔。实例:
HTTP响应说明:
1.消息头第一行由三个空格分开的元素组成,分别表示HTTP版本、请求状态码(数字)、请求状态描述
2.其他:
Server:旗标,指明使用的Web服务器软件
Set-Cookie:设置cookie信息,在随后向服务器发送的请求中由Cookie消息头返回
Content-Type:指定消息主体类型
Content-Length:指定消息主体的字节长度
应用开发
http包提供了HTTP服务器和客户端的开发接口,内置web服务器
针对web服务端开发流程为
- 定义处理器/处理器函数
接收用户数据
返回信息 - 启动web服务器
Request结构体
常用属性
Method: 请求方式
URL:请求的URL
Proto:请求协议
Header:请求头
ContentLength:请求体字节数量
Body:请求体流对象
Form:获取提交的所有数据,需要手动调用ParseForm
PostForm:获取所有body中提交的数据(application/x-www-form-urlencoded) ,需要手动调用ParseForm
MultipartForm:获取所有body中提交的数据(multipart/form-dat) ,需要手动调用ParseMutipartForm
常用方法
ParseForm:解析提交的数据(url&body[application/x-www-form-urlencode])
FormValue:根据名称获取提交的数据,自动调用ParseForm
PostFormValue:根据名称从body中获取提交的数据,自动调用ParseForm
ParseMultipartForm:解析提交的数据(url*body[multipart/form-data])
FormFile:根据名称从body中获取提交的文件数据流对象,自动调用ParseMutipartForm,ParseForm
静态文件服务器
客户端开发
发起Head请求
发起GET请求
发起POST请求
使用client发起原始请求
请求测试
day09/c3_web/p4_req/req_test.go
爬虫
按照一定规则自动的获取互联网上的信息(随着网络的迅速发展,互联网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战)
应用:
搜索引擎(Google、百度、Bing等搜索引擎,辅助人们检索信息)
股票软件(爬取股票数据,帮助人们分析决策,进行金融交易)
Web扫描(需要对网站所有的网页进行漏洞扫描)
获取某网站最新文章收藏
爬取天气预报
爬取漂亮mm照片
给空间朋友点赞
…
goquery
goquery包提供了发起HTTP请求并对返回结果HTML解析的功能
发起请求:goquery.NewDocument(url)
解析
查找元素:Find
查找子元素:ChildrenFiltered
获取内容:Text/Html
获取属性:Attr
遍历元素:Each
选择器
.class/#id/tag
复合选择器
RPC
RPC即远程过程调用(Remote Procedure Call),用于构建计算机之间的通信协议,该协议允许运行于一台计算机的程序调用另一台计算机上的程序,开发人员无需对交互过程进行编程
rpc和rpc/jsonrpc包提供了对RPC的支持
- rpc构建于TCP或HTTP协议之上,底层数据编码使用gob,因gob编码为golang自定义,所以无法支持跨语言调用
- rpc/jsonrpc构建于TCP协议之上,底层数据编码使用json,可支持跨语言调用
定义RPC结构体和方法
- RPC结构体和方法必须为公开
- 方法必须有两个参数和返回值error,第一个为参数为请求结构体变量指针,用于获取客户端提交的参数,第二个参数为响应结构体指针变量,用于结果返回,返回值error用于告知客户端错误信息
jsonrpc包常用函数
- Dial:连接JSONPRC
- ServeConn:处理客户端连接