آموزش توسعه یک برنامه انتقال فایل بسیار ساده با 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
![liara testimonial]()
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
![liara testimonial]()
jadi
با قدرت میتونم بگم تیم پشتیانی لیاراliara_cloud@یکی از بهترین تیمهای پشتیبانی که تا حالا دیدم. کارشون ارائه سرویسهای PaaS هست ولی من سوال در سطح برنامه خودمم(نه زیرساخت پلتفرم) که میپرسم بازم کامل و به موقع راهنمایی میکنن.
Amir
![liara testimonial]()
amirmazinani_ir
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
![liara testimonial]()
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
![liara testimonial]()
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
![liara testimonial]()
vanenshi