22 03 2022

第十七章、网络编程

        一、网络编程基本介绍

            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参考模型

            image.png

            2.2、网线、网卡、无线网卡

            image.png

            2.3、聊天工具案例

            image.png

            2.4、IP地址

            image.png

            2.5、端口介绍

            image.png

            image.png

            image.png

            image.png

             使用Telnet链接IP和端口:

             第一步、win10搜索控制面板

             第二步、点击启用或关闭windows功能

             image.png

             第三步、安装Telnet

             image.png

             第四步、使用telnet IP 端口号   ; ctrl + ] 退出,quit退出...

             image.png


            2.6、TCP Socket编程的客户端和服务器端

            image.png


            2.7、TCP Socket编程入门案例

            要求:

            image.png

            分析:

            image.png

            服务端:

            image.png

            服务端代码:

            image.png

            image.png

            客户端代码:

            image.png

            改进:

            image.png


        三、Redis基本介绍

            3.1、需求分析

            image.png

            3.2、技术储备-redis 

            3.2.1、redis 基本介绍

            image.png

            3.2.2、redis安装和基本使用

            image.png

            操作原理图:

            image.png

            链接redis:

            image.png

            

            3.2.3、redis操作指令一览

            网址:http://redisdoc.com/

            3.2.4、redis的基本使用

            image.png

            3.3、Redis的CURD

            3.3.1、Redis的五大数据类型

            String(字符串)、Hash(哈希)、Lish(链表)、集合(Set)、有序集合(Zset)


            String基本介绍:

            a、String是redis最基本的类型,一个key对应一个value

            b、String类型是二进制安全的,除普通字符串外,也可以存放图片等数据;单个value最大值512M

            image.png

            c、set操作,set[如果key存在就相当于修改,如果不存在相当于添加];set key value;

            d、get操作,直接 get key键

            e、del操作,直接del key键

            image.png

            f、set设置过期时间, setex  key  过期时间 value

            image.png

            g、mset同时设置一个或多个 key-value对,如果给定的key已经存在,那么mset会用新值覆盖原来的旧值,格式:mset key1 value1 key2 value2,可以使用mget 获取全部值   也可以单独使用get 指定的键

            image.png


            Hash基本介绍(hash类似golang里面的map):

            a、Redis hash是一个键值对集合

            b、Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

            c、设置指令格式: hset key field value    

            d、获取指令格式: hget key field 

            image.png

            e、获取所有: hgetall key

            image.png

            f、一次性设置所有:hmset key field value field value ...

            image.png

            g、一次性获取所有:hmget key field field ...

            image.png

            h、删除指定字段:hdel key field

            image.png

            i、hlen统计一个hash有几个元素

            image.png

            j、查看hash表key中,是否存在给定的field字段,指令格式:hexists key field

            image.png


            List(列表)基本介绍:

            列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

            List本质十个链表,List的元素是有序的,元素的值可以重复。

            List数据结构分析:

            image.png

            a、设置一个链表,从左边插入:lpush key value value value ...    依次放入aaa  bbb  ccc

            image.png

            b、获取链表内容,从左边“取出”(只是取出,链表中还存在这个数据):lrange key start stop ,这里的start代表开始,stop代表结束,当stop为-1的时候表示取到最后一个值,lrange key 0 -1,表示全部取出;依次取出 ccc  bbb  aaa  

            image.png

            image.png

            c、设置一个链表,从右边插入:rpush key value value value ...    依次放入ddd  eee

            image.png

            此刻再从左边取出, 看看数据结构:

            image.png

            d、从链表左边“弹出”(从链表中弹出移走数据):lpop key

            image.png

            e、从链表右边“弹出”(从链表中弹出移走数据):rpop key

            image.png

            f、删除整个链表:del key

            image.png

            注意事项:

            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:成员)

            image.png

            b、从集合中取出所有数据:smembers key

            image.png

            c、判断值是否是成员:sismember  key  member 

            image.png

            d、删除集合中指定的成员:srem key member

            image.png

            注意事项:

            a、元素的值不能重复

            image.png


            3.3、Golang操作Redis

            3.3.1、安装第三方开源redis库

            image.png

            golang下载第三方扩展库:

            https://github.com/gomodule/redigo

            安装:进入到gopath目录下,在终端执行:go get github.com/gomodule/redigo/redis

            image.png

            3.3.2、String类型数据操作

            image.png

            3.3.3、Hash类型数据操作

            image.png


            image.png

            image.png


            3.3.4、Redis连接池基本介绍

            a、事先初始化一定数量的链接,放入到连接池

            b、当Go需要操作Redis的时候,直接从Redis连接池取出链接即可

            c、可以节省零时获取Redis链接的时间,从而提高效率

            d、示意图

            image.png

            核心代码:

            image.png

            连接池使用案例:

            image.png

            image.png

            

        四、用户即时通讯系统

            4.1、需求分析

            image.png

            4.2、功能一,显示客户端菜单

            image.png

            4.3、功能二,完成用户登录

            image.png

            

          image.png

            4.4、功能三,完成客户端可以发送消息本身,服务端可以正常接收到消息,并根据客户端发送的消息判断用户的合法性,并返回相应的LoginResMes

            image.png

            编译:去到项目的根目录执行,go build -o xxx.exe  从src下的目录开始直到文件所在的包

            image.png

            服务端代码改进以后的框架结构图:

            image.png

            客户端代码改进以后的框架结构图:

            image.png

            4.5、功能四,在redis手动添加测试用户,并画图+说明

            image.png

            image.png

            输入的用户名在redis中存在则登录,否则退出系统并给出相应的提示(账号密码错误或者用户不存在)