آموزش توسعه یک برنامه انتقال فایل بسیار ساده با Python
۱۲ تیر ۱۴۰۰
![آموزش توسعه یک برنامه انتقال فایل بسیار ساده با python](https://cms.liara.ir/wp-content/uploads/2021/07/build-your-own-file-transfer-app-using-python.png)
یکی از بزرگترین نگرانیهای امروزهی ما در استفاده از پلتفرمهای مختلف این است که نمیتوانیم متوجه شویم چه کسی به اطلاعات شخصی ما دسترسی دارد یا از این اطلاعات برای چه مقاصدی استفاده میشود. همچنین حملههایی مانند 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![](data:image/svg+xml;charset=utf-8,%3Csvg height='400' width='400' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi![](data:image/svg+xml;charset=utf-8,%3Csvg height='400' width='400' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch![](data:image/svg+xml;charset=utf-8,%3Csvg height='400' width='400' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi![](data:image/svg+xml;charset=utf-8,%3Csvg height='400' width='400' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid![](data:image/svg+xml;charset=utf-8,%3Csvg height='80' width='80' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari![](data:image/svg+xml;charset=utf-8,%3Csvg height='400' width='400' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E)
![liara testimonial]()
vanenshi