آموزش توسعه یک برنامه انتقال فایل بسیار ساده با Python
۱۲ تیر ۱۴۰۰
یکی از بزرگترین نگرانیهای امروزهی ما در استفاده از پلتفرمهای مختلف این است که نمیتوانیم متوجه شویم چه کسی به اطلاعات شخصی ما دسترسی دارد یا از این اطلاعات برای چه مقاصدی استفاده میشود. همچنین حملههایی مانند MITM در تشدید این نگرانیها نیز تاثیرگذارند. بههمین منظور ما در این مقاله تصمیم داریم ایجاد یک برنامهی بسیار ساده برای انتقال فایلها در یک شبکهی محلی را به شما آموزش دهیم.
ایدهی ما برای توسعهی این برنامه ایجاد دو اسکریپت جداگانه برای سرور و کلاینت است. سرور مسئولیت دریافت فایلها را برعهده دارد و کلاینت به سرور متصل میشود تا فایل مورد نظرش را در سرور آپلود کند.
بیایید در قدم اول بهسراغ توسعهی سرور برنامه برویم:
# File-Transer Server
import socket
import tqdm
import os
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5001
BUFFER_SIZE = 4096
SEPARATOR = "<SEPARATOR>"
s = socket.socket()
s.bind((SERVER_HOST, SERVER_PORT))
s.listen(10)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")
print("Waiting for the client to connect... ")
client_socket, address = s.accept()
print(f"[+] {address} is connected.")
received = client_socket.recv(BUFFER_SIZE).decode()
filename, filesize = received.split(SEPARATOR)
filename = os.path.basename(filename)
filesize = int(filesize)
progress = tqdm.tqdm(range(filesize), f"Receiving {filename}", unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "wb") as f:
while True:
bytes_read = client_socket.recv(BUFFER_SIZE)
if not bytes_read:
break
f.write(bytes_read)
progress.update(len(bytes_read))
client_socket.close()
s.close()
در کدهای فوق از کتابخانهی tqdm
برای ایجاد progress bar و از کتابخانهی socket
برای انتقال فایل در شبکه استفاده شده است. پس از اجرای اسکریپت فوق میتوانید درخواستهای انتقال فایل خود را از طریق پورت ۵۰۰۱ به آدرس IP سرور ارسال کنید.
پس از توسعهی سرور برنامه باید بهسراغ کلاینت آن برویم:
# File-Transer Client
import socket
import tqdm
import os
SEPARATOR = "<SEPARATOR>"
BUFFER_SIZE = 4096
s = socket.socket()
host = input("Enter Server IP : ")
port = 5001
print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected to ", host)
filename = input("File to Transfer : ")
filesize = os.path.getsize(filename)
s.send(f"{filename}{SEPARATOR}{filesize}".encode())
#file = open(filename, 'wb')
progress = tqdm.tqdm(range(
filesize), f"Sending {filename}", unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "rb") as f:
while True:
bytes_read = f.read(BUFFER_SIZE)
if not bytes_read:
break
s.sendall(bytes_read)
progress.update(len(bytes_read))
s.close()
در اولین مرحله پس از اجرای اسکریپت کلاینت از شما خواسته میشود تا آدرس IP سرور را وارد کنید و در مرحلهی بعد مسیر فایلی که میخواهید به سرور انتقال پیدا کند، از شما درخواست میشود تا درنهایت فایل مورد نظر شما در سرور آپلود شود.
همانطور که در ابتدای مقاله گفته شده بود، هدف از این مقاله آموزش توسعهی یک برنامهی انتقال فایل بسیار ساده با استفاده از اسکریپت Python است اما شما میتوانید قابلیتهای جدیدی را براساس نیازهای خود به این برنامه اضافه کنید. برای مثال میتوانید قابلیت دریافت چندین فایل مختلف از کلاینتهای مختلف را در سرور برنامه پیادهسازی کرده یا فایلها را قبل از ارسال توسط کلاینت به سمت سرور، فشرده و رمزنگاری کنید.
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi