一、什麼是下載&with語句
- 下載: 從服務器Down一個文件。其具體流程是這樣的
- 客戶端發送下載的請求(包含要下載的文件唯一標識,比如文件名等)
- 服務器接收請求,在文件庫中查找同名文件,發送(以二進制碼流形式)數據流
- 客戶端新建一個同名的文件,然後將數據流寫入這個文件
- 客戶端保存文件
- 下面兩個代碼的效果是相同的,也就是說:with語句可以避免讀取寫入報錯。但是不可避免打開報錯(文件不存在時讀取),從代碼結構就可看出。
f = open(“xxx”)
try:
f.read()/write()
except:
f.close()
with open(“xxx”) as f:
f.read()/write()
- 下面我們從簡單的客戶端開始
二、客戶端
- 客戶端的職責有:
- 發送文件名
- 新建文件
- 接收二進制數據,並寫入,然後保存
1)接收二進制類客戶端
- 讓網絡調試助手當服務器。用程序發送文件名(擴展名我亂寫的),然後網絡調試助手收到文件名,發送數據(這裏我們假裝服務器打開了文件,直接發送數據過去)
- 出現亂碼是因爲,這裏是二進制文件,拿文本查看器肯定會亂碼(如果是發送一字節的英文,是不會亂碼的)當然,這裏轉碼沒有必要,因爲發送接收都是二進制,而且轉碼很容易報錯。同樣在Linux系統中,通過程序互發,是不會亂碼的。
2)接收文本類客戶端
- 只要把寫入文件那些代碼改了就行(原理就是先轉碼,再寫入),寫入部分的代碼如下:
- 運行效果如下(網絡調試助手和上面的做法一致)
三、服務器
- 服務器的職責:
- 接收要下載的文件名
- 打開相應文件,讀取裏面的內容,併發送
- 如果文件名不存在要提醒
- 自己試下,把接收發送封裝在一個函數內。(之後學習多任務要用到)
四、 兩個程序相互連接
- 拿寫好的服務器和客戶端相互連接(記得改ip和端口):