第十七章、网络编程
一、网络编程基本介绍
golang的主要设计目标之一就是面向大规模后端服务程序,网络通信是服务端程序必不可少的。
1.1、网络编程两种方式:
a、TCP socket编程,是网络编程的主流,之所以叫TCP socket编程,是因为底层基于TCP/IP协议的,比如:QQ
b、B/S结构的HTTP编程,我们使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用TCP socket实现的,比如:京东商城
二、TCP/IP协议
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是由网络层的IP协议和传输层的TCP协议组成
2.1、OSI与TCP/IP参考模型
2.2、网线、网卡、无线网卡
2.3、聊天工具案例
2.4、IP地址
2.5、端口介绍
使用Telnet链接IP和端口:
第一步、win10搜索控制面板
第二步、点击启用或关闭windows功能
第三步、安装Telnet
第四步、使用telnet IP 端口号 ; ctrl + ] 退出,quit退出...
2.6、TCP Socket编程的客户端和服务器端
2.7、TCP Socket编程入门案例
要求:
分析:
服务端:
服务端代码:
客户端代码:
改进:
三、Redis基本介绍
3.1、需求分析
3.2、技术储备-redis
3.2.1、redis 基本介绍
3.2.2、redis安装和基本使用
操作原理图:
链接redis:
3.2.3、redis操作指令一览
3.2.4、redis的基本使用
3.3、Redis的CURD
3.3.1、Redis的五大数据类型
String(字符串)、Hash(哈希)、Lish(链表)、集合(Set)、有序集合(Zset)
String基本介绍:
a、String是redis最基本的类型,一个key对应一个value
b、String类型是二进制安全的,除普通字符串外,也可以存放图片等数据;单个value最大值512M
c、set操作,set[如果key存在就相当于修改,如果不存在相当于添加];set key value;
d、get操作,直接 get key键
e、del操作,直接del key键
f、set设置过期时间, setex key 过期时间 value
g、mset同时设置一个或多个 key-value对,如果给定的key已经存在,那么mset会用新值覆盖原来的旧值,格式:mset key1 value1 key2 value2,可以使用mget 获取全部值 也可以单独使用get 指定的键
Hash基本介绍(hash类似golang里面的map):
a、Redis hash是一个键值对集合
b、Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
c、设置指令格式: hset key field value
d、获取指令格式: hget key field
e、获取所有: hgetall key
f、一次性设置所有:hmset key field value field value ...
g、一次性获取所有:hmget key field field ...
h、删除指定字段:hdel key field
i、hlen统计一个hash有几个元素
j、查看hash表key中,是否存在给定的field字段,指令格式:hexists key field
List(列表)基本介绍:
列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List本质十个链表,List的元素是有序的,元素的值可以重复。
List数据结构分析:
a、设置一个链表,从左边插入:lpush key value value value ... 依次放入aaa bbb ccc
b、获取链表内容,从左边“取出”(只是取出,链表中还存在这个数据):lrange key start stop ,这里的start代表开始,stop代表结束,当stop为-1的时候表示取到最后一个值,lrange key 0 -1,表示全部取出;依次取出 ccc bbb aaa
c、设置一个链表,从右边插入:rpush key value value value ... 依次放入ddd eee
此刻再从左边取出, 看看数据结构:
d、从链表左边“弹出”(从链表中弹出移走数据):lpop key
e、从链表右边“弹出”(从链表中弹出移走数据):rpop key
f、删除整个链表:del key
注意事项:
a、lindex :按照索引下标获得元素(从左到右,编号从0开始)
b、LLEN key :返回列表key的长度,如果key不存在,则key被解释为一个空列表,返回0
c、List数据,可以从左 或者从右插入添加
d、如果值全移除,对应的键也就消失了
Set(集合)基本介绍:
Redis的Set是string类型的无序集合,底层是Hash Table数据结构,Set也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复
a、添加数据到集合中:sadd key member member member ... (member:成员)
b、从集合中取出所有数据:smembers key
c、判断值是否是成员:sismember key member
d、删除集合中指定的成员:srem key member
注意事项:
a、元素的值不能重复
3.3、Golang操作Redis
3.3.1、安装第三方开源redis库
golang下载第三方扩展库:
https://github.com/gomodule/redigo
安装:进入到gopath目录下,在终端执行:go get github.com/gomodule/redigo/redis
3.3.2、String类型数据操作
3.3.3、Hash类型数据操作
3.3.4、Redis连接池基本介绍
a、事先初始化一定数量的链接,放入到连接池
b、当Go需要操作Redis的时候,直接从Redis连接池取出链接即可
c、可以节省零时获取Redis链接的时间,从而提高效率
d、示意图
核心代码:
连接池使用案例:
四、用户即时通讯系统
4.1、需求分析
4.2、功能一,显示客户端菜单
4.3、功能二,完成用户登录
4.4、功能三,完成客户端可以发送消息本身,服务端可以正常接收到消息,并根据客户端发送的消息判断用户的合法性,并返回相应的LoginResMes
编译:去到项目的根目录执行,go build -o xxx.exe 从src下的目录开始直到文件所在的包
服务端代码改进以后的框架结构图:
客户端代码改进以后的框架结构图:
4.5、功能四,在redis手动添加测试用户,并画图+说明
输入的用户名在redis中存在则登录,否则退出系统并给出相应的提示(账号密码错误或者用户不存在)