20192217 2019-2020-2 《Python程序設(shè)計》實驗三報告
課程:《Python程序設(shè)計》
班級: 1922
姓名: 程子軒
學(xué)號:20192217
實驗教師:王志強(qiáng)
實驗日期:2020年5月16日
必修/選修: 公選課
1.實驗內(nèi)容
創(chuàng)建服務(wù)端和客戶端,服務(wù)端在特定端口監(jiān)聽多個客戶請求。
客戶端和服務(wù)端通過Socket套接字(TCP/UDP)進(jìn)行通信。
2. 實驗過程及結(jié)果
先放代碼碼云鏈接:https://gitee.com/python_programming/czx/tree/master/
1.導(dǎo)入需要的模塊
import os from socket import * import base64
2.創(chuàng)建客戶端與服務(wù)端,并選擇好端口、緩沖區(qū)大小
服務(wù)器端
HOST = '127.0.0.1' #對bind()方法的標(biāo)識,表示可以使用任何可用的地址 PORT = 8001 #設(shè)置端口 BUFSIZ = 1024 #設(shè)置緩存區(qū)的大小 ADDR = (HOST, PORT)
客戶端
HOST = '127.0.0.1' PORT = 8001 BUFSIZ = 1024 ADDR = (HOST, PORT)
3.定義套接字,綁定地址
服務(wù)器端
tcpSerSock = socket(AF_INET, SOCK_STREAM) #定義了一個套接字 tcpSerSock.bind(ADDR) #綁定地址 tcpSerSock.listen(5) #規(guī)定傳入連接請求的最大數(shù),異步的時候適用
客戶端
tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR)
4.下面進(jìn)入客戶端與服務(wù)器端具體代碼編寫,放圖,并著圖講解
客戶端

服務(wù)器端


首先,我們要傳輸?shù)奈募赡懿恢挂粋€,故設(shè)置while循環(huán),直至輸入的文件名為空才跳出循環(huán),
接著我們連接服務(wù)端與客戶端,為判斷是否連接成功,設(shè)置一個print來輸出狀態(tài),
做完這些工作后我們就可以開始收發(fā)數(shù)據(jù)了!
先傳輸傳送的文件的相關(guān)信息,如文件名、文件大小等,可按需求進(jìn)行傳輸。此時,我設(shè)置了一個if語句
,如果用戶輸入了錯誤數(shù)據(jù)或者對應(yīng)的文件里面是空的,就會跳出此次循環(huán),提醒用戶在輸出一個正確的由內(nèi)容的文件名。
這些預(yù)備動作完成后,我們正式傳輸文件里的數(shù)據(jù):
打開對應(yīng)文件,提取文件里的內(nèi)容,然后
進(jìn)行加密:
我們已經(jīng)導(dǎo)入了模塊base64,這是一種最簡單的對文件的加密方法,具體方法大家可瀏覽相關(guān)文檔:
https://blog.csdn.net/zyz511919766/article/details/22681399?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
把加密后的內(nèi)容發(fā)送到客戶端進(jìn)行解密,并保存到一個新的文件中。
這樣就完成啦!
**小提示:1.記得加密也要對應(yīng)解密,不要忘了。
2.我用的這種原始的文件操作方法在write后,一定要先close(),再open()、read(),否則無法read到文件內(nèi)容。
3.最后不要忘記close(),不然占用著內(nèi)存還是有一定風(fēng)險。
4.最好在過程中多做一些print()便于發(fā)現(xiàn)代碼中的bug。
結(jié)果展示:




3. 實驗過程中遇到的問題和解決過程
-
問題1:編碼與解碼問題
-
問題1解決方案:記住xxx.xxx.xxx是有先后順序的,不能有如:f.decode().read() 這樣的操作,一定是f.read().decode()
-
問題2:客戶端能接受到服務(wù)端發(fā)送的文件信息,但收不到文件的密文(這問題整死我了)。
-
問題2解決方案:因為代碼運行時沒有報錯,沒有錯誤信息所以處理起來更加棘手。
![]()
![]()
![]()
通過debug定位到問題出在了服務(wù)器的第33行代碼上,但無從下手修改,在網(wǎng)上找了好多東西也解決不了。后來通過詢問老師與同學(xué),按照老師
的辦法將關(guān)鍵代碼拉出來debug修改,經(jīng)過一天的努力終于發(fā)現(xiàn)了錯誤所在,即小tips里提到的“在write后,一定要先close(),再open()、read(),否則無法read到文件內(nèi)容。”,最終解決了問題。
其他(感悟、思考等)
編程序一定要有耐心,對于一個問題一段時間解決不了不能輕易放棄,可以暫時性略過但是不能就此不管,不然學(xué)習(xí)漏洞百出,最后難以完成相應(yīng)的任務(wù)
而且需要發(fā)散思維,從不同角度看問題,同時也要多咨詢老師與同學(xué),他們也許有更多的經(jīng)驗以及解決方案。
還有,多看網(wǎng)上大神的代碼,很有幫助。
參考資料
- 藍(lán)墨云班課python教學(xué)
- https://blog.csdn.net/zyz511919766/article/details/22681399?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase base64庫應(yīng)用方法
- CSDN、博客園里的很多關(guān)于socket的文章


