20183215 2019-2020-2 《Python程序設計》實驗三報告
課程:《Python程序設計》
班級: 1832
姓名: 董振龍
學號: 20183215
實驗教師:王志強
實驗日期:2020年5月16日
必修/選修:公選課
1.實驗內容
1.創建服務端和客戶端,選擇一個通信端口,用Python語言編程實現通信演示程序;
2.要求包含文件的基本操作,例如打開和讀寫操作。
3.要求發送方從文件讀取內容,加密后並傳輸;接收方收到密文並解密,保存在文件中。
4.程序代碼托管到碼雲。
2. 實驗過程及結果
實驗開始之前,我設想了一下實驗結束后的效果,總覺得光禿禿的控制台缺乏美感(盡管是pycharm),於是,我打算加入GUI圖形界面,既然追求美感,就貫徹到底咯。
首先,我打開了一個軟件:wxFormBuilder(這里我參考了一個大佬的博客),打開后的界面是這樣的:
我們先選擇Forms點擊Frame,然后再建立幾個boxsizer,加入一些必備控件textctrl、button,如圖,其中,設置bsizer5的proportion為9,使其看上去更加和諧
最后進行一些細節上的設置,例如按鈕名稱以及事件綁定。最終效果如圖:
其中三個按鈕分別綁定事件:
保存之后可以導出對應的.py文件,基本重復上述操作,可以得到客戶端的圖形界面和對應的.py文件
打開pycharm,新建一個工程文件夾,將上述兩個.py文件復制到文件夾中,然后新建兩個.py文件,分別命名為severf.py和clientf.py,輸入以下內容繼承圖形界面
import wx
import severwindow #或clientwindow,下面同樣
class CliFrame(severwindow.Sever):
def __init__(self, parent):
severwindow.Sever.__init__(self, parent)
def main():
app = wx.App(False)
frame = CliFrame(None)
frame.Show(True)
app.MainLoop()
if __name__ == "__main__":
main()
pass
運行一下,結果如圖:
還有一點忘記說了,就是圖形界面的圖標和背景色,我在
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u" Client", pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
后面加入了,圖標是在這個網站上面搜的,就像我說的,既然要追求美觀,就貫徹到底咯
self.icon = wx.Icon('client.ico', wx.BITMAP_TYPE_ICO)
self.SetIcon(self.icon)
self.SetBackgroundColour('#00FFFF') #天藍色
接下來就是編寫對應的事件函數
服務器的打開按鈕:
def open_file(self,event):
text=self.file_name.GetValue()
file=open(text,"rb+")
self.file_content_d.SetValue(file.read())
file.close()
服務器的加密按鈕:
def encrypt_con(self,event):
content_d=self.file_content_d.GetValue()
content_e=base64.b64encode(content_d.encode())
self.file_content_e.SetValue(content_e)
服務器的發送按鈕:
def send_file(self,event):
content=self.file_content_e.GetValue()
conn.send(content.encode())
客戶端的解密按鈕:
def decrypt_con(self,event):
content_d=base64.b64decode(content)
self.file_content_d.SetValue(content_d)
服務器的保存按鈕:
def save_con(self,event):
text=self.file_name.GetValue()
file=open(text,"wb+")
content_d=base64.b64decode(content)
file.write(content_d)
file.close()
最后導入相關模塊就可以運行了,其中加密我用的是來自pycryptodome模塊的base64。運行結果如圖:
再然后就是老生常談的commit+push到git了,所有完整代碼在這里
3. 實驗過程中遇到的問題和解決過程
- 問題1:第一次繼承圖形界面並運行時報錯in _EvtHandler_Bind assert callable(handler) or handler is None
- 問題1解決方案:經檢查發現是按鈕的名稱與其綁定事件用了相同的字符串,經改正后就可以了
- 問題2:pycrypto的安裝出大問題
- 問題2解決方案:一開始我是知道pycrypto這個模塊,但是安裝卻一直失敗,百度之后,在這個博客(這個博客內容挺多,但是解決方法在最上面,👍)中找到了解決方法:安裝pycryptodome模塊,完美解決。
- 問題3:運行時客戶端解密出錯
- 問題3解決方案:經檢查發現在content_d=base64.b64decode(content)的content后面加了.encode(),但是沒有必要,因為服務器send過來的已經是bytes形式,刪除之后便可以正常運行了
感悟及思考
這次實驗讓我更好的了解了python的強大,wxFormBuilder的發現讓我感覺發現寶了,GUI圖形界面一直都是我學習各個程序設計語言時最鬧心的,這次實驗也讓我對於函數的運用更加熟悉。同時我感覺到還有很多值得我去開發去學習的,人生苦短,我學python。