1. 程式人生 > 其它 >用python寫一個加密通訊軟體

用python寫一個加密通訊軟體

這幾天想著完成這個python的加密通訊軟體,涉及到socket程式設計、加密技術以及一些python簡易UI的使用方法,正好在這裡做一個總結。

socket程式設計部分

  很明顯這個軟體最重要的就是socket程式設計部分的程式碼,因為是第一版的所以只要我們完成了相應功能就可以了。但是很多地方我們仍然要使用清楚,搞明白到底是怎麼用的。

  伺服器端

  需要匯入的包就只有socket和threading兩個包。

  之後我們要寫兩個函式,並使用執行緒來不斷執行這兩個函式 

def clientThreadIn(conn,nick):
    global data
    while True:
        
try: temp = conn.recv(1024) if not temp: conn.close() return NotifyAll(temp) print(data) except: NotifyAll(nick+'leaves the room') print(data) return

  使用一個大迴圈不斷去執行讀取資料的邏輯,temp從接收的資料中讀取1024個位元組,然後執行一個NotifyALL函式把這個資料傳進去。

def NotifyAll(ss):
    global data
    if con.acquire():
        data = ss
        con.notifyAll()
        con.release()

  這裡Condition物件(這裡的con)維護了一個鎖(Lock/RLock)和一個waiting池。執行緒通過acquire獲得Condition物件。這裡,使用acquire好比宣告我要執行下面的程式碼但是所有執行緒只能依次執行,我執行其他執行緒就需要等待。使用notifyAll則表示告訴其他執行緒可以搶奪這段資源的使用權了,但是此時我還沒有把資源釋放出去,需要最後執行release來把資源釋放給其他執行緒進行執行。

  在生產者-消費者模型中,生產者生產前使用acquire來進行生產宣告,迴圈中每生產一個就release釋放給其他的生產者,防止一次性生產太多,當貨物到達max的時候,則使用notifyall來告訴其他執行緒可以再來製造了,並使用wait讓自己處於等待,仍然也要使用release釋放給其他的生產者。這樣就能保證:我們一起製造貨物,但是實際上我們不會同時生產貨物而是按照順序來的,生產到上限我們則都會進行等待,如果生產的貨物被快速消耗掉了我們還會繼續生產。

  消費者模型則不需要,大家去搶奪資源就可以了。在產品被搶沒了的時候,使用生產者中的函式通知生產者進行生產。通知的時候每個執行緒只通知一次所以也要使用acquire,通知完後也要釋放掉。