数据库、TCP服务端实现协程

今日学习总结:

一、数据存放的发展

       1、随意存放在一个文件中的数据,数据的格式千差万别。比如: tank|123 jason:123 sean~123       

       2、软件开发目录规范

            Project:

                conf

                bin

                core

                db:存放一个个文件

         1和2都是从本地读取数据的

       3、将所有数据存放到一个第三方的公共位置,同一个软件凡是需要操作数据的,必须去这个共享的位置操作

            --第三方的公共位置(数据库)

            --数据库集群:将同一个数据库中的数据,复制到不同的服务器中

     4、MySQL 数据库:是c/s架构软件 

         01.mysql数据库本质上就是一个基于网络通信的软件

         02.所有基于网络通信的软件。底层都是socket          

             - 服务端:
                   - 基于网络通信
                   - 收发消息

            - 客户端:
                   - 基于网络通信
                   - 收发消息

     注意:所有语言若想操作数据库,拿到服务端ip和port,都必须遵循一套标准的解析指令,就是SQL语句,sql语句的由来,统一标准

      5、数据库分类

           01.关系型:MySQL postgreSQL orcale db2  sqlite sqlserver

          02.非关系型:redis mongodb 

二、安装数据库

     1.下载mysql安装包
     2.解压安装包放在D:中
     3.添加系统环境变量
     4.以管理员身份打开cmd,输入mysqld启动服务端,此时会卡主
        - bin目录下的: mysqld.exe

     5.新建一个cmd,输入mysql启动客户端连接服务端,输入mysql -h 127.0.0.1 -P 3306 -p 密码,进行登录
        - mysql初始化时无密码,不需要密码,直接输入mysql,就可以写操作了。这时游客模式,功能会很少
        - bin目录下的: mysql.exe

     6.登录客户端

         -打开cmd,输入mysql

          -简写: mysql -uroot -p 密码

          -全写: mysql -h 127.0.0.1 -P 3306 -p 密码

    7.开启服务端

       01.打开cmd,输入mysqld

       02.输入 net start mysql  (开启服务端mysqld)

     8.退出数据库客户端
        - exit; 退出
        - quit; 退出

注意: SQL语句末尾必须加 “;” 号。

三、 制作系统服务(在服务端mysqld 里做以下操作)

       1.必须将已启动的服务端mysqld关掉 (tasklist | findstr "mysqld"    表示查看pid号)
       2.删掉已经启动过的mysqld的进程    (taskkill /F /PID pid号    表示结束服务端mysqld进程)
       3.输入 mysqld --install (安装mysqld系统服务)
       4.输入 net start mysql  (开启服务端mysqld)

四、cmd 中操作语句

       1、查看操作系统中是否已经启动mysqld 服务端  得到pid号
           - tasklist | findstr "mysqld"

      2、杀死mysqld进程
          - taskkill /F /PID + pid号

注意:做服务端操作时,必须先以管理员身份打开

 

五、设置配置文件:

       1.先在mysql目录下 --》 D:\mysql-5.6.40-winx64

       2.创建一个名为 “my.ini” 的文件,这个是mysql的配置文件,里面用的xml的语法 写配置
          [mysqld]
          character-set-server=utf8
          collation-server=utf8_general_ci

          [client]                                                # 这个是用python软件连接的客户端

         default-character-set=utf8

         [mysql]                                               # mysql软件的客户端
        # 可写,可不写这样可以不需要用户名与密码直接登录mysql
        # user='root'
        # password=123

        default-character-set=utf8                 # 设置默认的字符编码

    3.重启mysql服务,即修改成功!

 六、修改、设置密码:

         - mysql -u 登录mysql用户名(root) -p 密码

         - 默认自带 root 超级用户, 没有密码
        1、管理员登录
             - mysql -uroot             回车进入

        2、游客登录
             - mysql                       回车

       3、修改密码:
           01 - 默认没有密码的情况下,设置密码
               - cmd>>>: mysqladmin -uroot password 123

           02- 有密码的情况下,修改密码
               - cmd>>>: mysqladmin -uroot -p原密码 password修改的密码
               - cmd>>>: mysqladmin -uroot -p123 password 123456

     4、破解密码: 当密码忘记时采用
          01.关闭服务端
          02.跳过权限启动服务端
             - cmd>>>: mysqld --skip-grant-tables

         03.客户端进入游客模式:

           - cmd>>>: mysql

          - cmd>>>: update mysql.user set password=password('123456') where user="root";

           解释:- update mysql库.user表名 set 字段password=字段password('字段值') where 条件(若条件成立,则修改)user="root";

      04.重新启动服务端,不要跳过权限认证
        - 先kill掉跳过权限认证启动的服务端进程
        - 再手动去开服务中的mysql服务即可

七、数据库基本操作:

      1、 查看所有数据库:
            - show databases;

     2、库的操作 ---> 类似于文件夹
         - 增:
           语法: create database 库名;
                  - create database db1;            # 创建一个数据库

         - 查
           语法: show databases;                   # 查看所有库
                    show create database db1;  # 查看db1库中的信息

         - 改
          语法: alter database 库名 charset="字符编码类型";
                 - alter database db1 charset="utf8";

        - 删
          语法: drop database db1;


   3、表的操作 ---> 类似于文件
        - 操作表前,需要先切换到指定库
          语法: use 库名;
                 - use db1;

       - 查看当前所在的库: select database;

       - 增:varchar与char 都是字符串类型;varchar(20)
         语法: create table 表名(字段名 字段类型);
                  create table user_info(name varchar(20), age int);

       - 查

         语法:show tables;            # 查看当前库中所有的表
         语法:desc user_info;        # 查看表结构

      - 改
        语法: alter table 表名 modify name varchar(28);
               - alter table user_info modify name varchar(28);

     - 删
       语法: drop table 表名;
          - create table test(id int);
          - drop table test;

4、记录 的操作 ---> 类似于文件中的一行行数据
     - 增:
       语法: insert into 表名 values('字段类型的数据1', 字段类型的数据2);
              - insert into user_info values('tank', 17);                            #插入一条数据

             - insert into user_info values('jason', 71), ('sean', 78);        #插入多条数据

  - 查:
    语法: select * from 表名;                                               # 查看表中所有的数据,*: 指的是所有
           - select * from user_info;

           - select * from 表名 where 条件;                            # 条件成立则查看成功!
           - select * from user_info where name="tank";       # 查看name 字段为 tank 的记录

          - select age from user_info where name="tank";   # 查看name 字段为 tank 的age字段

          - select name from user_info;                                # 查看所有的名字:

 - 改
   语法: update 表名 set 字段名=字段值 where 条件判断;              # 若条件成立,则修改成功!

         - update user_info set name='handsome' where age=17;   # 修改age为17的记录中name属性为 handsome

         - update user_info set name='d_sb' where age>16;           # 修改age>16的记录 中name属性为 d_sb

- 删

  语法: delete from 表名;
         - delete from user_info;                                                     # 清空表记录,不提交,可恢复。

         -delete from user_info where age=17;

语法: truncate table 表名;
       - truncate table user_info;                                                  # 删除,不可恢复

 

 八、TCP服务端实现协程

client 文件

from threading import Thread, current_thread
import socket
def send_get_msg():                        # 向服务端发送或接受数据
    client = socket.socket()
    client.connect(('127.0.0.1', 9999))
    while True:
        client.send(f'{current_thread().name}'.encode('utf-8'))  # 发送数据
        #current_thread是一个方法,可以获取线程的名字:用current_thread().name
        data = client.recv(1024)                                 # 接收数据
        print(data.decode('utf-8'))
# 模拟100个用户访问服务端
if __name__ == '__main__':
    list1 = []
    for line in range(100):
        t = Thread(target=send_get_msg)
        t.start()
        list1.append(t)
    for t in list1:
        t.join()

 

server文件


from gevent import monkey; monkey.patch_all()
from gevent import spawn
import socket
server = socket.socket()
server.bind(('127.0.0.1', 9999))
server.listen(5)
# 与客户端通信
def working(conn):
    while True:
        try:
            data = conn.recv(1024)         #接收数据
            if len(data) == 0:
                break
            print(data.decode('utf-8'))
            conn.send(data.upper())       #发送数据
        except Exception as e:
            print(e)
            break
    conn.close()
# 与客户端连接
def run(server):                     # server 是对象参数
    while True:                      # 反复的建立通道
        conn, addr = server.accept()
        print(addr)
        spawn(working, conn)         #spawn是Greenlet类中的spawn方法。def spawn(cls, *args, **kwargs):
if __name__ == '__main__':
    print('服务端已启动...')
    g = spawn(run, server)          # spawn(函数名,参数1,参数2)
    g.join()
posted @ 2019-12-10 15:29  薛定谔的猫66  阅读(614)  评论(0)    收藏  举报