1. 程式人生 > >python_day26__02__檔案的傳送

python_day26__02__檔案的傳送

#Author:'haijing'
#date:2018/11/14

#直接拖動一張圖片到該軟體的目錄下
#建立一個yuan的package,把該圖片傳送到yaun的package中去

#post_server服務端:在別人的哪裡
#必須線開啟server端

import socket #socket是一個介面 內部封裝了有關ip地址和埠號的資訊 並且建立ip和埠號
import subprocess #下面目前就使用一個類Popen,讓程式碼在dos環境下執行
import os

sk = socket.socket() #建立一個socket物件s 服務端的sk物件和客戶端的sk物件完全是不一樣的
address = ('127.0.0.1',8000) #設定一個元組,元組內放的是ip和埠號:8000

sk.bind(address) #繫結ip和埠號,bind方法後跟的必須是一個元組
sk.listen(3) #3表示服務端最多和三個客戶端同時建立通訊,但是傳送資訊的話只能是一個一個的來
print('waiting...')
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #那個post_server.py的上一級目錄

while 1:
conn,addr = sk.accept() # 客戶端開啟之後就一直在這裡等待著
#接收將要接收的檔案資訊
data = conn.recv(1024)
cmd,file_name,file_size = str(data,'utf8').split('|')#先將接收到的data轉換為str型別的,再以豎線將str格式的data分開,分別傳給三個變數

path = os.path.join(BASE_DIR,'yuan',file_name) #yuan是在post_server上級目錄中一個包的名字
file_size = int(file_size)

#接收要寫入的檔案
f = open(path,'ab') #a表示如果沒有該路徑path,那麼就去建立該路徑,b是以bytes型別寫,開啟檔案
has_receive = 0
print('開始寫入')
while has_receive != file_size:
data = conn.recv(1024)
f.write(data)

has_receive += len(data)
f.close()
print('寫入成功')


#Author:'haijing'
#date:2018/11/14

#post_client客戶端
#必須線開啟server端
#此程式碼可以執行輸入的dos環境下的命令,並返回執行的命令的結果

import socket
import os

sk = socket.socket() #建立socket物件 服務端的sk物件和客戶端的sk物件完全是不一樣的
address = ('127.0.0.1',8000) #設定元組 裡面放的是需要連線的伺服器的ip地址
sk.connect(address) #連線ip地址為127.0.0.1的服務端

BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #post_client.py的上一級目錄
while 1:
#jing發 不能發空,否則對方會停在阻塞的狀態
inp_jing = input('>>>') #輸入上傳的命令,例如post|post.jpg 這裡是相對路徑
cmd,path = inp_jing.split('|') #以豎線將輸入的內容分開,並分別傳遞給cmd和path
path = os.path.join(BASE_DIR,path) #路徑的拼接,生成要上傳的檔案的絕對路徑

file_name = os.path.basename(path) #basename的作用是取到path最後的檔名字 例此時filename=post.jpg
file_size = os.stat(path).st_size #拿到檔案的大小,例post.jpg檔案的大小

#傳送檔案資訊
file_info = 'post|%s|%s' %(file_name,file_size) #字串拼接
sk.sendall(bytes(file_info,'utf8')) #首先給server端傳送要傳送的命令和檔案資訊

#傳送檔案
# with open(path,'rb') as f #rb表示以bytes讀
f = open(path,'rb')
has_send = 0
print('開始傳送')
while has_send != file_size:
data = f.read(1024) #一次讀1024個位元組的資料,以為是以bytes型別讀的,所以是位元組
sk.sendall(data)
has_send +=len(data)
f.close()
print('傳送成功')

sk.close #關的此客戶端是和服務端之間的通訊通道,同樣server端也是有關掉通訊通道的能力,但是server端一般是不會關的