2017-9-4:學習筆記
一丶socketserver模塊
SocketServer內部使用 IO多路復用 以及 “多線程” 和 “多進程” ,從而實現並發處理多個客戶端請求的Socket服務端。即:每個客戶端請求連接到服務器時,Socket服務端都會在服務器是創建一個“線程”或者“進 程” 專門負責處理當前客戶端的所有請求。註:導入模塊的時候 3.x版本是socketserver 2.x版本是SocketServer
-
1.ThreeadingTCPServer
ThreadingTCPServer實現的Socket服務器內部回味每個client創建一個線程,該線程用來和用戶進行交互
-
1.ThreadingTCPServer基礎
創建一個繼承自己SocketServer.BaseRequestHandler類類中必須定一個名稱為handle的方法
- 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"))客戶端
- 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方法)
-
2.ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 “線程” 和 “進程”。
二丶數據庫
-
數據庫介紹
之前所學,數據要永久保存,比如用戶註冊的用戶信息,都是保存於文件中,而文件只能存在於某一臺機器上。如果我們不考慮從文件中讀取數據的效率問題,並且假設我們的程序所有的組件都運行在一臺機器上,那麽用文件存取數據,並沒有問題,但需要考慮的問題是:程序的執行效率依賴於承載它的硬件,而一臺機器機器的性能總歸是有限的,受限於目前的硬件水平,垂直擴展是有極限的。於是我們只能通過水平擴展來增強我們系統的整體性能,這就需要我們將程序的各個組件分布於多臺機器去執行。需要註意的是,雖然我們將程序的各個組件分布到各臺機器,但各組件仍然是一個整體,言外之意,所有組件的數據還是要共享的。但每臺機器上的組件都只能操作本機的文件,這就導致了數據必然不一致。於是我們想到了將數據與應用程序分離:把文件存放於一臺機器,然後將多臺機器通過網絡去訪問這臺機器上的文件,即共享這臺機器上的文件,共享則意味著競爭,會發生數據不安全,需要加鎖處理。。。。
為了遠程訪問並處理這臺共享機器上的文件,我們必須為我們的程序額外寫一段代碼,完成如下功能:
#1.遠程連接 #2.打開文件 #3.讀寫(加鎖) #4.關閉文件
2.數據庫的安裝
linux
源碼安裝mysql 源碼安裝mariadbwindows
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:學習筆記