TCP模式的檔案同步

2021-08-25 11:05:36 字數 3136 閱讀 3050

import socket,shutil,time,os

# 伺服器上檔案所在的資料夾

file = r'c:\users\wudi.hapmmagna\desktop\python學習'

# 將資料夾中的檔案全部壓縮,並轉化為二進位制檔案,給二進位制檔案新增nowisend結束字尾

defzip_data

(): shutil.make_archive('zipdata','zip',file)

with open('zipdata.zip','rb')as f:

data = f.read()

return data + b'nowisend'

# 將從客戶端上傳的二進位制檔案先寫入為壓縮包,再將壓縮包解壓到伺服器資料夾,如果資料夾中存在檔案,則先刪除後新增

defunzip_data

(data):

with open('unzipdata.zip','wb')as f:

f.write(data)

list = os.listdir(file)

if list != none:

for i in list:

os.remove(os.path.join(file,i))

shutil.unpack_archive('unzipdata.zip',file)

# 主函式

defmain

():# 建立tcp伺服器,用ip4位址

addr = ('******x',8888)

server = socket.socket(socket.af_inet,socket.sock_stream)

# 伺服器繫結位址

server.bind(addr)

# 伺服器開始監聽

server.listen()

# 第一死迴圈,讓伺服器不斷迴圈等待客戶端

while

true:

print('等待客戶端')

con,addr = server.accept()

print('客戶端已連線,'.format(addr))

#第二個死迴圈,當連線後,一直接受客戶端的相應命令

while

true:

# 指令

cmd = con.recv(1024).decode()

# 當指令為download時,傳送壓縮包二進位制檔案

if cmd == 'download':

data = zip_data()

con.sendall(data)

print('傳送檔案,大小為 '.format(time.ctime(), len(data)))

# 當指令為upload時,接受二進位制檔案,並將其解壓到相應資料夾

if cmd == 'upload':

data = b''

while

true:

temp = con.recv(1024)

ifb'nowisend'

in temp:

temp = temp.replace(b'nowisend', b'')

data += temp

break

data += temp

unzip_data(data)

print('上傳檔案,大小為'.format(time.ctime(), len(data)))

#當指令為exit時,跳出接受指令的死迴圈迴圈

if cmd == 'exit':

break

con.close()

print('客戶端已關閉')

# 主函式呼叫

if __name__ == '__main__':

main()

import socket,shutil,os

file = r'/home/wu/桌面/python'

defunzip_file

(data):

with open('unzipdata.zip','wb')as f:

f.write(data)

list = os.listdir(file)

if list != none:

for i in list:

os.remove(os.path.join(file,i))

shutil.unpack_archive('unzipdata.zip',file)

defzip_file

(): shutil.make_archive('zipdata','zip',file)

with open('zipdata.zip','rb')as f:

data = f.read()

return data + b'nowisend'

defmain

(): addr = ('******',8888)

client = socket.socket(socket.af_inet,socket.sock_stream)

client.connect(addr)

while

true:

st = input('請輸入命令: ')

cmd = st.encode()

client.sendall(cmd)

if st == 'download':

data = b''

while

true:

temp = client.recv(1024)

ifb'nowisend'

in temp:

temp = temp.replace(b'nowisend',b'')

data += temp

break

data += temp

unzip_file(data)

if st == 'upload':

data = zip_file()

client.sendall(data)

print('檔案已經上傳')

if st == 'exit':

client.close()

break

if __name__ == '__main__':

main()

雙機tcp同步 TCP同步與非同步

首先我簡單介紹一下同步tcp程式設計 與非同步tcp程式設計。1 1 同步 在服務端我們通常用乙個tcplistener來監聽乙個ip和埠。客戶端來乙個請求的連線,在服務端可以用同步的方式來接收,也可以用非同步的方式去接收。比如 tcplistene server new tcplistener i...

boost asio的Tcp同步方式

boost.asio是乙個跨平台的網路及底層io的c 程式設計庫。標頭檔案 include命名空間 using namespace boost asio using boost asio ip tcp asio庫能夠使用tcp udp icmp 串列埠來傳送 接收資料,本文件介紹tcp協議的同步讀寫...

boost asio程式設計 同步TCP

boost.asio庫是乙個跨平台的網路及底層io的c 程式設計庫,它使用現代c 手法實現了統一的非同步呼叫模型。boost.asio庫支援tcp udp icmp通訊協議。下面介紹同步tcp模式 在伺服器端,我會做個socket交給acceptor物件,讓它一直等客戶端連進來,連上以後再通過這個s...