Python學習筆記之網絡編程

操做MySQLphp

# 斷言 assert(1==1)

#############################################################################

********************************************************************
# 建立Connection                                                   *        
-------------------------------------------------------------------*
Connection:建立了Python客戶端與數據庫之間的網絡通路。他的參數以下 *
-------------------------------------------------------------------*
參數名        類型        說明                                       *
host        String        MySQL的服務器地址                           *
port        int            MySQL的端口號                               *
user        String        用戶名                                       *
passwd        String        密碼                                       *
db            String        使用的數據庫                               *
charset        String        鏈接字符集                                   *
                                                                 *    
-------------------------------------------------------------------*
Connection支持的方法:                                               *
-------------------------------------------------------------------*
方法名        說明                                                   *
cursor()    建立而且返回遊標                                       *
commit()    提交當前事物                                           *
rollback()    回滾當前事物r()                                        *
close()        關閉Connection                                         *
-------------------------------------------------------------------*
#獲取Cursor.                                                       *
-------------------------------------------------------------------*
Cursor:遊標對象,用於執行查詢和獲取結果,它支持的方法以下:        *
-------------------------------------------------------------------*
方法名                說明                                           *
execute()            用於執行一個數據庫的查詢命令                   * 
fetchone()            獲取結果集中的下一行                           *
fetchmany(size)     獲取結果集中的下(size)行                     *
fetchall()            獲取結果集中剩下的全部行                       *
rowcount            最近一次execute返回數據/影響的行數             *
close()                關閉遊標                                       * 
********************************************************************

#############################################################################
建立鏈接:conn = pymysqsl.connect(xxxx)
建立遊標:cur = conn.cursor()
執行sql:cur.execute(sql)
返回全部結果:data = cur.fetchall()
返回N行結果: cur.fetchmany(3)
返回一行結果:cur.fetchone
關閉遊標,數據庫
cur.close()
conn.close()

#############################################################################
# 該模塊防sql注入, 不支持+字符串連接,默認%s佔位符
sql =  "insert into admin(name,address) values (%s,%s)"
params = ('alex_1', 'usea')
recout =  cur.execute(sql, params)
# insert、update、del的時候須要commit,select的時候不須要
con.commit

# commit 提交

#在fetch數據時按照順序進行,可使用cursor.scroll(num,mode)來移動遊標位置,如:

    cursor.scroll(1,mode='relative')  # 相對當前位置移動
    cursor.scroll(2,mode='absolute') # 相對絕對位置移動
#############################################################################
# 多條
sql =  "insert into admin(name,address) values (%s,%s)"
params = [
            ('alex_1', 'usea'),
            ('alex_2', 'usea')
        ]
recout =  cur.executemany(sql, params)

#執行多條sql,只會提交一次,失敗則回滾
con.commit  

# 顯示sql列名, 遊標 設置爲字典類型
cur = con.cursor(cursor = pymysql.cursors.DictCursor)

# 獲取自增id
cur.lastrowid
#############################################################################
# 事務
    事物用於將某些操做的多個sql做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性
    
# 事務的特性
    事務有如下四個標準屬性的縮寫ACID,一般被稱爲:
        1.原子性:確保工做單元內的全部操做都成功完成,不然事務將被停止在故障點,和之前的操做將回滾到之前的狀態
        2.一致性:確保數據庫正確地改變狀態後,成功提交事務
        3.隔離性:使事務操做彼此獨立和透明的
        4.持久性:確保提交的事務的結果或交過的系統出現故障的狀況下仍然存在
    
    在MySQL中,事務開始使用commit或rollback語句開始工做和結束。開始和結束語句的sql命令之間造成大量的事務。
#COMMIT % ROLLBACK
    這倆個關鍵字提交和回滾主要用於MySQL的事務。
    
    當一個成功的事務完成後,發出commit命令應使全部參與表的更改纔會生效
    
    若是發生故障時,應發出一個rollback命令返回的事務中引用的每個表之前的狀態
    
    可控制的事務行爲成爲AUTOCOMMIT設置會員變量。若是AUTOCOMMIT設置爲1(默認值),人後每個sql語句(在事務與否)被認爲是一個完整的事務,並承諾在默認狀況下,當它完成。
    AUTOCOMMIT設置爲0時,發出SET AUTOCOMMIT = 0 命令,在隨後的一系列語句的做用就像一個事務,知道一個明確的COMMIT語句時,沒有活動的提交
    
    能夠經過使用mysql_query()函數在php中執行這些sql命令
    
# 通用事務例子
    這一系列事件是獨立於所使用的編程語言,能夠創建在任何使用的語言來建立應用程序的邏輯路徑
    能夠經過使用mysql_query()函數在php中執行這些sql命令
    
    BEGIN WORK開始事務發出sql命令
    
    發出一個或多個sql命令,如select、insert、update、delete
    檢查是否有任何錯誤,一切都依據的須要
    若是有任何錯誤,那麼問題rollback命令,不然發出commit命令
    
# 在項目設計裏面,牽扯到金錢的轉義,因而就要用到mysql的事務處理,來確保一組處理結果的正確性。用了事務,就不可避免的要犧牲一部分速度,來確保數據的正確性
    事務ACID Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
    1.事務的原子性
        一組事務,要麼成功,要麼撤回
    2.穩定性
        有非法數據(外鍵約束之類),事務撤回
    3.隔離性
        事務獨立運行
            一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回
            事務的100%隔離,須要犧牲速度
    4.可靠性
        軟、硬件奔潰後,InnoDB數據表驅動會利用日誌文件重構修改
        可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit選項,決定何時把事務保存到日誌裏
        
        開啓事務
            START TRANSACTION 或 BEGIN
        
        提交事務(關閉事務)
            COMMIT
            
        放棄事務(關閉事務)
            ROLLBACK
            
        折返點
            SAVEPOINT adqoo_1
            ROLLBACK TO SAVEPOINT adqoo_1
            發生在折返點adqoo_1以前的事務被提交,以後的被忽略
            
        事務的終止
            設置"自動提交" 模式
            SET AUTOCOMMIT = 0
            每條SQL都是同一個事務的不一樣命令,之間有COMMIT 或 ROLLBACK隔開
            掉線後,沒有COMMIT的事務都被放棄
            
# 事務鎖定模式
    系統默認:不須要等待某事務結束,可直接查詢到結果,但不能再進行修改、刪除
    缺點:查詢到的結果,多是已通過期的
    優勢:不須要等待某事務結束,可直接查詢到結果
    
# 須要用如下模式來設定鎖定模式
    1.SELECT....LOCK IN SHARE MODE(共享鎖)
        查詢到的數據,就是數據庫在這一時刻的數據(其餘已COMMIT事務的結果,已經反應到這裏了)
        SELECT 必須等待,某個事務結束後才能執行
    
    2.SELECT...FOR UPDATE(排它鎖)
        例如 SELECT* FROM tablename WHERE id < 200
        那麼當id < 200的數據,被查詢到的數據,都將不能再進行修改、刪除、SELECT...LOCK IN SHARE MODE 操做  一直到事務結束
        
        共享鎖和排它鎖的區別:在因而否阻斷其餘用戶發出的SELECT...LOCK IN SHARE MODE 命令
        
    3.INSERT/UPDATE/DELETE
        全部關聯數據都會被鎖定,加上排它鎖
        
    4.防插入鎖
        例如SELECT * FROM tablename WHERE id > 200
        那麼id  > 200的記錄沒法被插入
        
    5.死鎖
        自動識別死鎖
        先進來的進程被執行,後來的進程收到出錯的消息,並按ROLLBACK方式回滾
        innodb_lock_wait_timeout = n 來設置最長等待時間、默認50秒
                
# 事務隔離模式
    
    SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
    READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
    
    1.不帶SESSION/GLOBAL的SET命令
        只對下一個事務有效
    
    2.SET SESSION|
        爲當前會話設置隔離模式
        
    3.SET GLOBAL
        爲之後新建的全部MYSQL鏈接設置隔離模式(當前瞭解不包括在內)
        
# 隔離模式
    READ UNCOMMITTED
    
    不隔離SELECT
        其餘事務未完成的修改(未COMMIT),其結果也在考慮以內
        
    READ COMMITTED
        把其餘事務的 COMMIT 修改考慮在內
        同一個事務中,同一 SELECT 可能返回不一樣結果
    
    EPEATABLE READ(默認)
        不把其餘事務的修改考慮在內,不管其餘事務是否用COMMIT命令提交過
        同一個事務中,同一 SELECT 返回同一結果(前提是本事務,不修改)

   SERIALIZABLE
        和REPEATABLE READ相似,給全部的SELECT都加上了 共享鎖

    出錯處理
        根據出錯信息,執行相應的處理
        
# MYSQL的事務處理主要有兩種方法
    1.用begin,rollback,commit 來實現
        begin開始一個事務
        rollback事務回滾
        commit事務確認
        
    2.直接用set來改變mysql的自動提交模式
        mysql默認是自動提交的,也就是你提交一個query,就直接指向!能夠經過
        set autocommit = 0 禁止自動提交
        set autocommit = 1 開啓自動提交
      來實現事務的處理
    
    但要注意當用set autocommit = 0 的時候,你之後全部的sql都將做爲事務處理,直到你用commit確認或 rollback結束,注意當你結束這個事務的同時也開啓了新的事務!按第一種方法只將當前的作爲一個事務!
    MYSQL只有 INNODB和BDB類型的數據表才支持事務處理,其餘的類型是不支持的!
            
    

 

 

Socketpython

 

# 三層架構(3-tier architecture) 一般意義上的三層架構就是將整個業務應用劃分爲:
    表現層(Presentation layer)、業務邏輯層(Business Logic Layer)、數據訪問層(Data access layer)。
        1、表現層(UI):通俗講就是展示給用戶的界面,即用戶在使用一個系統的時候他的所見所得。
        2、業務邏輯層(BLL):針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。
        3、數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、查找等。
        
########################################################################################################################    
TCP/IP不是一個協議,而是一個協議族的統稱。裏面包括IP協議、IMCP協議、TCP協議。

TCP/IP分層:應用層HTTP/FTP,傳輸層TCP/UDP,網絡層ip協議 ARP/RARP , 數據鏈路層

# 協議
*********************************************************
7 應用層     |                <應用層>                    *
--------------         TELNET,SSH,HTTP,SMIP,POP,          *
6 表示層     |         SSL/TLS,FTP,MIME,HTML,           *
--------------           SNMP,MIB,SIP,RTP....           *
5 會話層     |                                          * 
--------------------------------------------------------*
4 傳輸層     |                <傳輸層>                    *
             |        TCP,UDP,UDP-Lite,SCTP,DCCP        *
--------------------------------------------------------*
3 網絡層     |                <網絡層>                    *
             |          ARP,IPv4,IPv6,ICMP,IPsec        *
--------------------------------------------------------*
2 數據鏈路層 |                                          *
--------------          以太網,無線WLAN、PPP.........    *
1 物理層     |          (雙紋線電纜,無線,光纖...)     *
*********************************************************

########################################################################################################################
        
# socket
    Python提供兩個級別訪問的網絡服務
        1.低級別的網絡服務支持基本的socket,他提供了標準的BSD sockets API, 能夠訪問底層操做系統Socket接口的所有方法
        2.高級別的網絡服務模塊SocketServer,它提供了服務器中心類,能夠簡化網絡服務器的開發

# 什麼是socket
    socket又稱"套接字", 應用程序一般經過"套接字"向網絡發出請求或者應答網請求,使主機間或者一臺計算機上的進程能夠通信
    
    socket的英文原義是「孔」或「插座」。做爲BSD UNIX的進程通訊機制,取後一種意思。一般也
    稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。
    在Internet上的主機一 般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不一樣的端口對應於不一樣的服務。



########################################################################################################################
# TCP服務器                                              *           # TCP客戶端    
1  經過socket類建立socket對象 socket()                  *        4  經過socket類建立socket對象 socket()
2  socket綁定ip,端口 bind()                          *        5  connect()鏈接服務,指定主機和端口
3  listen()最大的鏈接數,監聽                          *           7  客戶端連接成功,想服務器發送連接狀態信息
6  經過阻塞的accept()方法得到客戶端返回的連接信息     *           9  客戶端向socket寫入信息(或服務端向socket寫入信息)
8  服務器accept方法返回,鏈接成功                      *        11 客戶端關閉
10 服務器讀取信息(客戶端讀取信息)
12 服務器端關閉


########################################################################################################################
# 鏈接原理
根據鏈接啓動的方式以及本地套接字要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。

(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態。

(2)客戶端請求:是指由客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求。

(3)鏈接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求,它就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接 字的描述發給客戶端,一旦客戶端確認了此描述,鏈接就創建好了。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。


########################################################################################################################
服務器端

s.bind()     
# 綁定地址(host,port)到套接字, 在AF_INET下,以元組(host,port)的形式表示地址。
s.listen()     
# 開始TCP監聽。backlog指定在拒絕鏈接以前,操做系統能夠掛起的最大鏈接數量。該值至少爲1,大部分應用程序設爲5就能夠了。
s.accept()     
# 被動接受TCP客戶端鏈接,(阻塞式)等待鏈接的到來


客戶端

s.connect()     
# 主動初始化TCP服務器鏈接,。通常address的格式爲元組(hostname,port),若是鏈接出錯,返回socket.error錯誤。
s.connect_ex()     
# connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常


公共用途的函數

s.recv()     
# 接收TCP數據,數據以字符串形式返回,bufsize指定要接收的最大數據量。flag提供有關消息的其餘信息,一般能夠忽略。
s.send()     
# 發送TCP數據,將string中的數據發送到鏈接的套接字。返回值是要發送的字節數量,該數量可能小於string的字節大小。
s.sendall()     
# 完整發送TCP數據,完整發送TCP數據。將string中的數據發送到鏈接的套接字,但在返回以前會嘗試發送全部數據。成功返回None,失敗則拋出異常。
s.close()
# 關閉套接字


s.recvform()     
# 接收UDP數據,與recv()相似,但返回值是(data,address)。其中data是包含接收數據的字符串,address是發送數據的套接字地址。
s.sendto()     
# 發送UDP數據,將數據發送到套接字,address是形式爲(ipaddr,port)的元組,指定遠程地址。返回值是發送的字節數。
s.getpeername()     
# 返回鏈接套接字的遠程地址。返回值一般是元組(ipaddr,port)。
s.getsockname()     
# 返回套接字本身的地址。一般是一個元組(ipaddr,port)
s.setsockopt(level,optname,value)     
# 設置給定套接字選項的值。
s.getsockopt(level,optname[.buflen])      
# 返回套接字選項的值。
s.settimeout(timeout)     
# 設置套接字操做的超時期,timeout是一個浮點數,單位是秒。值爲None表示沒有超時期。通常,超時期應該在剛建立套接字時設置,由於它們可能用於鏈接的操做(如connect())
s.gettimeout()     
# 返回當前超時期的值,單位是秒,若是沒有設置超時期,則返回None。
s.fileno()     
# 返回套接字的文件描述符。
s.setblocking(flag)     
# 若是flag爲0,則將套接字設爲非阻塞模式,不然將套接字設爲阻塞模式(默認值)。非阻塞模式下,若是調用recv()沒有發現任何數據,或send()調用沒法當即發送數據,那麼將引發socket.error異常。
s.makefile()     
# 建立一個與該套接字相關連的文件


########################################################################################################################
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
參數一:地址簇
    socket.AF_INET IPv4(默認)
    socket.AF_INET6 IPv6
    socket.AF_UNIX 只可以用於單一的Unix系統進程間通訊
參數二:類型
    socket.SOCK_STREAM  流式socket , for TCP (默認)
    socket.SOCK_DGRAM   數據報式socket , for UDP
    socket.SOCK_RAW 原始套接字,普通的套接字沒法處理ICMP、IGMP等網絡報文,而
    SOCK_RAW能夠;其次,SOCK_RAW也能夠處理特殊的IPv4報文;此外,利用原始套接字,能夠
    經過IP_HDRINCL套接字選項由用戶構造IP頭。
    socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付數據報但不保證順序。
    SOCK_RAM用來提供對原始協議的低級訪問,在須要執行某些特殊操做時使用,
    如發送ICMP報文。SOCK_RAM一般僅限於高級用戶或管理員運行的程序使用。
  socket.SOCK_SEQPACKET 可靠的連續數據包服務
參數三:協議
    0  (默認)與特定的地址家族相關的協議,若是是 0 ,
    則系統就會根據地址格式和套接類別,自動選擇一個合適的協議

recv 從緩存區拿數據,最多隻能拿1024字節

########################################################################################################################
 
 

#!/usr/bin/evn python3
# _*_ coding:utf-8 _*_
import socketmysql

 
 

# #############客戶端####################sql

 
 

# 第一步建立一個socket對象
client = socket.socket()數據庫

 
 

# 第二步鏈接服務
ip_port = ('127.0.0.1', 8080)
client.connect(ip_port)編程

 
 

while True:
# 第三步 獲取數據
data = client.recv(1024)
print(data.decode('utf-8'))
# 發送數據
inp = input('clent:')
client.send(inp.encode("utf-8"))
if inp == 'exit':
break緩存

 

 

#!/usr/bin/evn python3
# _*_ coding:utf-8 _*_
import socket服務器

# #############服務端####################網絡

# 第一步建立一個socket對象
sk = socket.socket()多線程

# 第二步綁定ip、端口
ip_port = ('127.0.0.1', 8080)
sk.bind(ip_port)

# 第四步 設置監聽
sk.listen(5)

while True:
# 第五步 接收請求,獲取到客戶端的socket對象和ip端口
conn, address = sk.accept()
# 第六步,給客戶端發信息
conn.send('hello'.encode('utf-8'))
# 第七步,close
flag = True
while flag:
data = conn.recv(1024)
print(data)
if data == 'exit':
flag = False
conn.send('pm 是個煞筆'.encode('utf-8'))
conn.close()

 

 

#!/usr/bin/evn python3
# _*_ coding:utf-8 _*_
import socketserver


# #############多線程服務端####################


class MyServer(socketserver.BaseRequestHandler):

def handle(self):
conn = self.request
conn.sendall('hello'.encode('utf-8'))
flag = True
while flag:
data = conn.recv(1024)
if data == 'exit':
flag = False
conn.send('pm 是個煞筆'.encode('utf-8'))
conn.close()

if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer) server.serve_forever()

相關文章
相關標籤/搜索