1. 程式人生 > >2017-9-4:學習筆記

2017-9-4:學習筆記

基類 mysql密碼 fault 高級 問題 ble 代碼 skip rip

一丶socketserver模塊

SocketServer內部使用 IO多路復用 以及 “多線程” 和 “多進程” ,從而實現並發處理多個客戶端請求的Socket服務端。即:每個客戶端請求連接到服務器時,Socket服務端都會在服務器是創建一個“線程”或者“進 程” 專門負責處理當前客戶端的所有請求。
註:導入模塊的時候 3.x版本是socketserver 2.x版本是SocketServer
  1. 1.ThreeadingTCPServer

ThreadingTCPServer實現的Socket服務器內部回味每個client創建一個線程,該線程用來和用戶進行交互

  1. 1.ThreadingTCPServer基礎

創建一個繼承自己SocketServer.BaseRequestHandler類類中必須定一個名稱為handle的方法

  1. 1).啟動ThreadingTCPServer:
技術分享
服務端:
import socketserver
class MyTCPhandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                data=self.request.recv(1024)
                if not data:break
self.request.send(data.upper()) except Exception: break self.request.close() if __name__ == __main__: server=socketserver.ThreadingTCPServer((127.0.0.1,8082),MyTCPhandler) server.allow_reuse_address=True server.serve_forever()
服務器 技術分享
 1 客戶端:
 2 
 3 from socket import *
 4 client=socket(AF_INET,SOCK_STREAM)
 5 client.connect((127.0.0.1,8082))
 6  
 7 while True:
 8     msg=input(>>: ).strip()
 9     if not msg:continue
10     client.send(msg.encode(utf-8))
11     data=client.recv(1024)
12     print(data.decode("utf-8"))
客戶端
  1. 2).程序的運行流程:
  • 啟動服務端程序
  •     執行 TCPServer.init 方法,創建服務端Socket對象並綁定 IP 和 端口
  •     執行 BaseServer.init 方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 - MyRequestHandle賦值給 self.RequestHandlerClass
  •     執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 ...
  •   當客戶端連接到達服務器
  •     執行 ThreadingMixIn.process_request 方法,創建一個 “線程” 用來處理請求
  •     執行 ThreadingMixIn.process_request_thread 方法
  •     執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)
  1. 2.ForkingTCPServer

ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 “線程” 和 “進程”。

二丶數據庫

  1. 數據庫介紹

  之前所學,數據要永久保存,比如用戶註冊的用戶信息,都是保存於文件中,而文件只能存在於某一臺機器上。如果我們不考慮從文件中讀取數據的效率問題,並且假設我們的程序所有的組件都運行在一臺機器上,那麽用文件存取數據,並沒有問題,但需要考慮的問題是:程序的執行效率依賴於承載它的硬件,而一臺機器機器的性能總歸是有限的,受限於目前的硬件水平,垂直擴展是有極限的。於是我們只能通過水平擴展來增強我們系統的整體性能,這就需要我們將程序的各個組件分布於多臺機器去執行。需要註意的是,雖然我們將程序的各個組件分布到各臺機器,但各組件仍然是一個整體,言外之意,所有組件的數據還是要共享的。但每臺機器上的組件都只能操作本機的文件,這就導致了數據必然不一致。於是我們想到了將數據與應用程序分離:把文件存放於一臺機器,然後將多臺機器通過網絡去訪問這臺機器上的文件,即共享這臺機器上的文件,共享則意味著競爭,會發生數據不安全,需要加鎖處理。。。。

為了遠程訪問並處理這臺共享機器上的文件,我們必須為我們的程序額外寫一段代碼,完成如下功能:

#1.遠程連接
#2.打開文件
#3.讀寫(加鎖)
#4.關閉文件

2.數據庫的安裝

linux
技術分享源碼安裝mysql 技術分享源碼安裝mariadb

windows

1.下載

http://dev.mysql.com/downloads/mysql/

#建議從官網下載,其他的包很有可能報錯。

2.解壓到文件夾

如果想要讓MySQL安裝在指定目錄,那麽就將解壓後的文件夾移動到指定目錄,如:C:\mysql-5.7.16-winx64

3.初始化

MySQL解壓後的 bin 目錄下有一大堆的可執行文件,執行如下命令初始化數據:

cd c:\mysql-5.7.16-winx64\bin
 
mysqld --initialize-insecure

4.啟動MySql服務

執行命令從而啟動MySQL服務

1 # 進入可執行文件目錄
2 cd c:\mysql-5.7.16-winx64\bin
3  
4 # 啟動MySQL服務
5 mysqld

5.啟動MySQL客戶端並連接MySQL服務

啟動MySQL客戶端並連接MySQL服務

由於初始化時使用的【mysqld --initialize-insecure】命令,其默認未給root賬戶設置密碼

# 進入可執行文件目錄
cd c:\mysql-5.7.16-winx64\bin
 
# 連接MySQL服務器
mysql -u root -p
 
# 提示請輸入密碼,直接回車
6.簡單操作

a.添加環境變量

【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名為Path 的一行,雙擊】 --> 【將MySQL的bin目錄路徑追加到變值值中,用 ; 分割】

如此一來,以後再啟動服務並連接時,僅需:

# 啟動MySQL服務,在終端輸入
mysqld
 
# 連接MySQL服務,在終端輸入:
mysql -u root -p

b.

b. 將MySQL服務制作成windows服務

上一步解決了一些問題,但不夠徹底,因為在執行【mysqd】啟動MySQL服務器時,當前終端會被hang住,那麽做一下設置即可解決此問題:

註意:--install前,必須用mysql啟動命令的絕對路徑

# 制作MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
# 移除MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

註冊成服務之後,以後再啟動和關閉MySQL服務時,僅需執行如下命令:

1 # 啟動MySQL服務
2 net start mysql
3  
4 # 關閉MySQL服務
5 net stop mysql

mysql軟件基本管理

1. 啟動查看

[[email protected] ~]# systemctl start mariadb #啟動
[[email protected] ~]# systemctl enable mariadb #設置開機自啟動
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[[email protected] ~]# ps aux |grep mysqld |grep -v grep #查看進程,mysqld_safe為啟動mysql的腳本文件,內部調用mysqld命令
mysql     3329  0.0  0.0 113252  1592 ?        Ss   16:19   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     3488  0.0  2.3 839276 90380 ?        Sl   16:19   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[[email protected] ~]# netstat -an |grep 3306 #查看端口
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN  
[[email protected] ~]# ll -d /var/lib/mysql #權限不對,啟動不成功,註意user和group
drwxr-xr-x 5 mysql mysql 4096 Jul 20 16:28 /var/lib/mysql

2. 登錄,設置密碼

初始狀態下,管理員root,密碼為空,默認只允許從本機登錄localhost
設置密碼
[[email protected] ~]# mysqladmin -uroot password "123"        設置初始密碼 由於原密碼為空,因此-p可以不用
[[email protected] ~]# mysqladmin -uroot -p"123" password "456"        修改mysql密碼,因為已經有密碼了,所以必須輸入原密碼才能設置新密碼

命令格式:
[[email protected] ~]# mysql -h172.31.0.2 -uroot -p456
[[email protected] ~]# mysql -uroot -p
[[email protected] ~]# mysql                    以root用戶登錄本機,密碼為空

3. 忘記密碼

windows平臺下,5.7版本mysql,破解密碼的兩種方式:

技術分享
1 #1 關閉mysql
2 #2 在cmd中執行:mysqld --skip-grant-tables
3 #3 在cmd中執行:mysql
4 #4 執行如下sql:
5 update mysql.user set authentication_string=password(‘‘) where user = root;
6 flush privileges;
7 
8 #5 tskill mysqld
9 #6 重新啟動mysql

技術分享
#1. 關閉mysql,可以用tskill mysqld將其殺死
#2. 在解壓目錄下,新建mysql配置文件my.ini
#3. my.ini內容,指定
[mysqld]
skip-grant-tables

#4.啟動mysqld
#5.在cmd裏直接輸入mysql登錄,然後操作
update mysql.user set authentication_string=password(‘‘) where user=root and host=localhost;

flush privileges;

#6.註釋my.ini中的skip-grant-tables,然後啟動myqsld,然後就可以以新密碼登錄了

方式二

4. 在windows下,為mysql服務指定配置文件

 
#在mysql的解壓目錄下,新建my.ini,然後配置
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
#解壓的目錄
basedir=E:\mysql-5.7.19-winx64
#data目錄
datadir=E:\my_data #在mysqld --initialize時,就會將初始數據存入此處指定的目錄,在初始化之後,啟動mysql時,就會去這個目錄裏找數據

[client]
port=3306
default-character-set=utf8























2017-9-4:學習筆記