Halo, coder kece! 👋 Kali ini, kita bakal bikin sesuatu yang seru banget: Remote Desktop sederhana menggunakan Python, dan yang lebih keren lagi, kita bakal menjalankannya dengan Laragon! 🚀✨
Yup, kita akan membuat server dan client berbasis GUI yang bisa menjalankan perintah dari jarak jauh, seperti membuka Notepad, mengambil screenshot, dan membuka DXDiag. Penasaran? Yuk, langsung gaspol! 💨
🖥️ Apa Itu RDP (Remote Desktop Protocol)?
RDP (Remote Desktop Protocol) adalah sebuah protokol yang memungkinkan seseorang mengontrol komputer lain dari jarak jauh melalui jaringan. Dengan RDP, kita bisa menjalankan perintah, membuka aplikasi, bahkan melihat tampilan layar komputer target seolah-olah kita sedang menggunakannya langsung.
Tapi dalam proyek ini, kita tidak menggunakan RDP bawaan Windows maupun aplikasi pihak lain, melainkan membuat versi sederhana dari remote desktop menggunakan Python.
🎯 Cara Kerja Remote Desktop Sederhana Ini
- Server (Komputer yang dikontrol):
- Menunggu koneksi dari client.
- Menerima perintah dari client (misalnya, buka Notepad, ambil screenshot).
- Mengirimkan hasil perintah atau file screenshot kembali ke client.
- Client (Komputer pengontrol):
- Menghubungkan diri ke server.
- Mengirimkan perintah ke server.
- Menerima respons dari server.
Dengan cara ini, kita bisa mengendalikan komputer lain dari jarak jauh secara sederhana.
🛠️ Library & Tools yang Digunakan
Dalam proyek ini, kita menggunakan beberapa library Python dan tools pendukung. Yuk, kita bahas satu per satu! 🔍
1️⃣ Python & Laragon 🐍💙
Python adalah bahasa pemrograman utama yang kita gunakan untuk membangun aplikasi ini.
Sedangkan Laragon adalah environment yang kita pakai untuk menjalankan Python dengan mudah di Windows, mirip seperti XAMPP tapi lebih fleksibel.
Kenapa pakai Laragon?
- Bisa menjalankan Python tanpa perlu ribet setting PATH di Windows.
- Ringan dan cepat, cocok buat pengembangan aplikasi lokal.
2️⃣ Socket 🔗 (Bawaan Python)
Library bawaan Python yang digunakan untuk membuat komunikasi antara server dan client melalui jaringan.
- Server akan mendengarkan koneksi dari client.
- Client akan menghubungkan diri ke server dan mengirimkan perintah.
Contoh penggunaan:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8888))
server_socket.listen(1)
3️⃣ Tkinter 🖼️
Library bawaan Python yang digunakan untuk membuat tampilan GUI (Graphical User Interface).
Contoh penggunaan:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Aplikasi GUI")
root.mainloop()
Dengan Tkinter, kita bisa membuat:
- Text Area untuk menampilkan log aktivitas.
- Entry Field untuk mengetik perintah.
- Button untuk mengirim perintah ke server.
4️⃣ PyAutoGUI 🖥️📸
Digunakan untuk menangkap screenshot layar secara otomatis.
Fungsi utama:
- Mengambil screenshot dan menyimpannya dalam format gambar.
- Bisa digunakan untuk kontrol otomatis GUI.
Cara install:
pip install pyautogui
Contoh penggunaan:
import pyautogui
screenshot = pyautogui.screenshot()
screenshot.save("screenshot.png")
5️⃣ Pillow 🖼️
Library yang digunakan untuk manipulasi gambar di Python.
Kita pakai untuk menyimpan hasil screenshot yang diambil dari PyAutoGUI.
Cara install:
pip install pillow
Contoh penggunaan:
from PIL import Image
img = Image.open("screenshot.png")
img.show()
⚙️ Langkah Instalasi dan Konfigurasi Python di Laragon
1️⃣ Aktifkan Virtual Environment 🛠️
Sebelum menginstal library, kita harus menjalankan virtual environment agar proyek tetap rapi dan tidak bentrok dengan sistem Python lainnya.
💡 Langkah-langkahnya:
📌 Buka terminal Laragon, masuk dalam direktori project kamu, lalu jalankan perintah berikut:
🔹 Membuat virtual environment:
python -m venv venv
🔹 Aktifkan virtual environment:
- Windows:
venv\Scripts\activate
- Linux/Mac:
source venv/bin/activate
✅ Jika berhasil, di terminal akan muncul tanda (venv) sebelum nama direktori.
2️⃣ Install Library yang Dibutuhkan 📦
Setelah virtual environment aktif, install library yang diperlukan dengan perintah:
pip install pyautogui
pip install pillow
🎯 Tahapan Pengembangan
🚀 Kode Server (server.py
)
Buka Laragon, jalankan terminal, lalu buat file server.py
. Copy-paste kode ini:
import socket # Impor modul socket untuk komunikasi jaringan
import threading # Impor modul threading untuk menjalankan beberapa proses
import tkinter as tk # Impor tkinter untuk GUI
from tkinter import scrolledtext, ttk # Impor komponen GUI tambahan dari tkinter
import subprocess # Impor subprocess untuk menjalankan perintah sistem
import pyautogui # Impor pyautogui untuk mengambil screenshot
import os # Impor modul os untuk interaksi dengan sistem operasi
class ServerApp:
def __init__(self, root):
self.root = root # Inisialisasi root window
self.root.title("Server RDP Sederhana") # Set judul window
self.root.geometry("500x600") # Set ukuran window
self.root.configure(bg="#f0f0f0") # Set warna latar belakang window
# Membuat area teks dengan scrollbar
self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=20, font=("Helvetica", 10), bg="#ffffff", fg="#000000")
self.text_area.pack(pady=20, padx=20) # Menempatkan area teks di window
# Menampilkan alamat IP pada area teks
local_ip = socket.gethostbyname(socket.gethostname())
self.text_area.insert(tk.END, f"Selamat datang di RDP Python Sederhana, Alamat IP: {local_ip}\n")
# Membuat tombol untuk memulai server
self.start_button = ttk.Button(root, text="Mulai Server", command=self.start_server)
self.start_button.pack(pady=10) # Menempatkan tombol di window
# Membuat tombol untuk menghentikan server
self.stop_button = ttk.Button(root, text="Hentikan Server", command=self.stop_server)
self.stop_button.pack(pady=10) # Menempatkan tombol di window
self.server_socket = None # Inisialisasi socket server
self.client_sockets = [] # Inisialisasi daftar socket klien
# Styling untuk tombol
style = ttk.Style()
style.configure("Start.TButton", font=("Helvetica", 12, "bold"), background="#4CAF50", foreground="black", padding=10, relief="raised", borderwidth=4)
style.configure("Stop.TButton", font=("Helvetica", 12, "bold"), background="#f44336", foreground="black", padding=10, relief="raised", borderwidth=4)
style.map("Start.TButton", foreground=[('pressed', 'yellow'), ('active', 'blue')], background=[('pressed', '!disabled', 'black'), ('active', 'white')])
style.map("Stop.TButton", foreground=[('pressed', 'yellow'), ('active', 'blue')], background=[('pressed', '!disabled', 'black'), ('active', 'white')])
self.start_button.configure(style="Start.TButton")
self.stop_button.configure(style="Stop.TButton")
# Membuat label footer
self.footer_label = tk.Label(root, text="dibuat oleh audhighasu.com", font=("Arial", 10), bg="#f0f0f0")
self.footer_label.pack(side=tk.BOTTOM, pady=10) # Menempatkan label footer di window
def start_server(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Membuat socket server
self.server_socket.bind(('0.0.0.0', 8888)) # Mengikat socket ke alamat IP dan port
self.server_socket.listen(1) # Server mulai mendengarkan koneksi
self.text_area.insert(tk.END, "Server berjalan...\n") # Menampilkan pesan di area teks
threading.Thread(target=self.accept_connections, daemon=True).start() # Membuat thread untuk menerima koneksi
def stop_server(self):
if self.server_socket:
for client_socket in self.client_sockets:
client_socket.close() # Menutup semua koneksi klien
self.server_socket.close() # Menutup socket server
self.server_socket = None
self.client_sockets = [] # Mengosongkan daftar klien
self.text_area.insert(tk.END, "Server dan semua koneksi klien dihentikan.\n") # Menampilkan pesan server dihentikan
def accept_connections(self):
while True:
try:
client_socket, addr = self.server_socket.accept() # Menerima koneksi dari klien
self.client_sockets.append(client_socket) # Menambahkan socket klien ke daftar
self.text_area.insert(tk.END, f"Koneksi diterima dari {addr}\n") # Menampilkan alamat klien di area teks
threading.Thread(target=self.handle_client, args=(client_socket,), daemon=True).start() # Membuat thread untuk menangani klien
except socket.error:
break # Keluar dari loop jika server dihentikan
def handle_client(self, client_socket):
while True:
try:
message = client_socket.recv(1024).decode() # Menerima pesan dari klien
if message:
if message.strip().lower() == "buka notepad":
subprocess.Popen(["notepad.exe"]) # Membuka Notepad
self.text_area.insert(tk.END, "Perintah untuk membuka Notepad diterima dan dieksekusi.\n")
elif message.strip().lower() == "ambil screenshot":
screenshot = pyautogui.screenshot() # Mengambil screenshot
screenshot_file = "server_screenshot.png"
screenshot.save(screenshot_file) # Menyimpan screenshot
self.text_area.insert(tk.END, "Screenshot layar server diambil dan disimpan.\n")
self.send_file(client_socket, screenshot_file) # Mengirim file screenshot ke klien
elif message.strip().lower() == "buka dxdiag":
subprocess.Popen(["dxdiag.exe"]) # Membuka Dxdiag
self.text_area.insert(tk.END, "Perintah untuk membuka Dxdiag diterima dan dieksekusi.\n")
else:
self.text_area.insert(tk.END, f"Klien: {message}\n") # Menampilkan pesan dari klien
except socket.error:
self.text_area.insert(tk.END, "Koneksi terputus\n") # Menampilkan pesan jika koneksi terputus
client_socket.close() # Menutup socket klien
break
def send_file(self, client_socket, file_path):
# Kirim nama file terlebih dahulu
filename = os.path.basename(file_path)
client_socket.send(f"FILE:{filename}".encode()) # Mengirim informasi nama file
client_socket.recv(1024) # Menunggu konfirmasi dari klien
# Mengirim isi file dalam bentuk binary
with open(file_path, 'rb') as file:
while True:
data = file.read(1024)
if not data:
break
client_socket.send(data)
client_socket.send(b'END_OF_FILE') # Mengirim sinyal akhir file
self.text_area.insert(tk.END, "Screenshot telah dikirim ke klien.\n") # Menampilkan pesan bahwa screenshot telah dikirim
if __name__ == "__main__":
root = tk.Tk() # Membuat instance Tkinter
app = ServerApp(root) # Membuat instance aplikasi server
root.mainloop() # Memulai loop utama Tkinter
📡 Kode Client (client.py
)
Sekarang buat file client.py
, lalu copy kode ini:
import socket # Impor modul socket untuk komunikasi jaringan
import threading # Impor modul threading untuk eksekusi konkuren
import tkinter as tk # Impor modul tkinter untuk GUI
from tkinter import scrolledtext, messagebox, ttk # Impor komponen GUI tambahan dari tkinter
import os # Impor modul os untuk interaksi dengan sistem operasi
class ClientApp:
def __init__(self, root):
self.root = root
self.root.title("Aplikasi Desktop Remote Python Sederhana") # Atur judul jendela
self.root.geometry("500x700") # Atur ukuran jendela
self.root.configure(bg="#2c3e50") # Atur warna latar belakang jendela
# Styling
style = ttk.Style()
style.configure("TButton", font=("Helvetica", 12), padding=6)
style.configure("TLabel", font=("Helvetica", 12), background="#2c3e50", foreground="white")
style.configure("TEntry", font=("Helvetica", 12), padding=5)
# Area teks dengan scrollbar
self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=60, height=15, font=("Consolas", 10), bg="#ecf0f1", fg="#2c3e50")
self.text_area.pack(pady=20, padx=20)
# Label dan entri IP server
self.ip_label = ttk.Label(root, text="IP Server:")
self.ip_label.pack(pady=5)
self.ip_entry = ttk.Entry(root, width=60)
self.ip_entry.pack(pady=5)
# Tombol koneksi
self.connect_button = ttk.Button(root, text="Sambung", command=self.connect_to_server)
self.disconnect_button = ttk.Button(root, text="Putus", command=self.disconnect_from_server)
self.connect_button.pack(pady=5)
self.disconnect_button.pack(pady=5)
# Entri pesan dan tombol kirim
self.entry = ttk.Entry(root, width=60)
self.entry.pack(pady=5)
self.send_button = ttk.Button(root, text="Kirim Pesan", command=self.send_message)
self.send_button.pack(pady=5)
# Tombol fungsi
function_buttons_frame = ttk.Frame(root)
function_buttons_frame.pack(pady=5)
self.open_notepad_button = ttk.Button(function_buttons_frame, text="Buka Notepad", command=self.open_notepad)
self.take_screenshot_button = ttk.Button(function_buttons_frame, text="Ambil Screenshot", command=self.take_screenshot)
self.open_dxdiag_button = ttk.Button(function_buttons_frame, text="Buka Dxdiag", command=self.open_dxdiag)
self.open_notepad_button.pack(side=tk.LEFT, padx=5)
self.take_screenshot_button.pack(side=tk.LEFT, padx=5)
self.open_dxdiag_button.pack(side=tk.LEFT, padx=5)
# Label footer
self.footer_label = ttk.Label(root, text="Dibuat oleh audhighasu.com")
self.footer_label.pack(side=tk.BOTTOM, pady=10)
self.client_socket = None # Inisialisasi socket klien sebagai None
def connect_to_server(self):
ip_address = self.ip_entry.get()
try:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((ip_address, 8888))
self.text_area.insert(tk.END, f"Terhubung ke server di {ip_address}\n")
self.receive_messages()
except Exception as e:
messagebox.showerror("Kesalahan Koneksi", f"Tidak dapat terhubung ke server: {e}")
def disconnect_from_server(self):
if self.client_socket:
self.client_socket.close()
self.client_socket = None
self.text_area.insert(tk.END, "Terputus dari server.\n")
def send_message(self):
if self.client_socket:
message = self.entry.get()
self.client_socket.sendall(message.encode())
self.text_area.insert(tk.END, f"Anda: {message}\n")
self.entry.delete(0, tk.END)
def open_notepad(self):
if self.client_socket:
self.client_socket.sendall("buka notepad".encode()) # Perintah yang dikoreksi untuk sesuai dengan perintah yang diharapkan server
self.text_area.insert(tk.END, "Perintah untuk membuka Notepad terkirim.\n")
def take_screenshot(self):
if self.client_socket:
self.client_socket.sendall("ambil screenshot".encode())
self.text_area.insert(tk.END, "Perintah untuk mengambil screenshot terkirim.\n")
def open_dxdiag(self):
if self.client_socket:
self.client_socket.sendall("buka dxdiag".encode())
self.text_area.insert(tk.END, "Perintah untuk membuka Dxdiag terkirim.\n")
def receive_messages(self):
def receive():
while True:
try:
message = self.client_socket.recv(1024).decode()
if message.startswith("FILE:"):
filename = message.split(":")[1]
self.client_socket.send(b'OK')
self.download_file(filename)
else:
self.text_area.insert(tk.END, f"Server: {message}\n")
except:
self.text_area.insert(tk.END, "Koneksi hilang\n")
self.client_socket.close()
break
threading.Thread(target=receive, daemon=True).start()
def download_file(self, filename):
with open(filename, 'wb') as file:
while True:
data = self.client_socket.recv(1024)
if data == b'END_OF_FILE':
break
file.write(data)
self.text_area.insert(tk.END, f"Screenshot disimpan sebagai {filename}\n")
if __name__ == "__main__":
root = tk.Tk()
app = ClientApp(root)
root.mainloop()
🏃♂️ Cara Menjalankan Proyek Python di Laragon
Setelah instalasi library selesai, sekarang saatnya menjalankan proyek! masuk kedalam direktori project kamu menggunakan terminal bawaan laragon
1️⃣ Pastikan Virtual Environment Aktif 🌐
Sebelum menjalankan script, aktifkan virtual environment dengan cara:
🔹 Buka terminal Laragon, lalu jalankan:
- Windows:
venv\Scripts\activate
- Linux/Mac:
source venv/bin/activate
✅ Jika berhasil, akan muncul tanda (venv) di awal terminal.
2️⃣ Jalankan Script Python 🏗️
Setelah virtual environment aktif, jalankan script dengan perintah:
python server.py
dan
python client.py
Tampilan server.py

Tampilan client.py

3️⃣ Keluar dari Virtual Environment 🔚
Setelah selesai menjalankan proyek, keluar dari virtual environment dengan perintah:
deactivate
🔹 Ini akan mengembalikan terminal ke mode normal.
🏗️ Cara Membuat Aplikasi Python Menjadi .EXE di Laragon
Kalau mau bikin aplikasi Python jadi file executable (.exe) supaya bisa dijalankan tanpa harus install Python, kita bisa pakai PyInstaller.
1️⃣ Pastikan Virtual Environment Aktif
Sebelum lanjut, aktifkan virtual environment dulu:
- Windows :
env\Scripts\activate
- Linux/Mac :
source venv/bin/activate
✅ Pastikan tanda (venv) muncul di awal terminal.
2️⃣ Install PyInstaller 🔧
Kalau belum ada, install dulu PyInstaller:
pip install pyinstaller
🔹 Pastikan instalasi sukses tanpa error.
3️⃣ Buat File .EXE 🚀
Misalnya, kita punya script main.py, jalankan perintah ini untuk membuat executable:
pyinstaller --onefile --noconsole server.py
pyinstaller --onefile --noconsole client.py
🔹 Penjelasan opsi:
--onefile
→ Menggabungkan semua file jadi satu.exe
--noconsole
→ Menghilangkan jendela CMD saat aplikasi dijalankan
4️⃣ Cek Hasilnya 📂
Setelah proses selesai, cek folder dist/
. Di dalamnya ada file server.exe
dan client.exe
, dan ini bisa langsung dijalankan tanpa perlu Python lagi! 🎉
✅ Cara menjalankan:
Klik dua kali server.exe dan
atau jalankan lewat CMD:client.exe
dist\main.exe
5️⃣ Buat Installer (Opsional) 📦
Kalau mau bikin installer (setup.exe) biar gampang diinstall, bisa pakai Inno Setup atau NSIS. Ini akan membantu buat installer profesional seperti aplikasi Windows lainnya.
🔎 Kesimpulan: Membangun dan Menjalankan Aplikasi RDP Controller di Laragon
Dalam proyek ini, kita telah membangun aplikasi otomatisasi kendali jarak jauh (RDP Controller) menggunakan Python yang terintegrasi dengan Laragon. Berikut adalah rangkuman langkah-langkah secara sistematis:
1️⃣ Memahami Konsep RDP & Library yang Digunakan
- Apa itu RDP?
RDP (Remote Desktop Protocol) adalah protokol yang digunakan untuk mengontrol komputer lain dari jarak jauh melalui jaringan. - Library yang Digunakan:
- PyAutoGUI → Untuk mengontrol mouse dan keyboard secara otomatis.
- Pillow → Untuk menangani manipulasi gambar dan screenshot.
2️⃣ Persiapan & Instalasi Python di Laragon
- Pastikan Laragon sudah terpasang dan Python telah dikonfigurasi di dalamnya.
- Buat Virtual Environment (Venv) agar proyek lebih rapi dan terisolasi. bashSalinEdit
python -m venv venv
- Aktifkan Virtual Environment:
3️⃣ Instalasi Library yang Dibutuhkan
Setelah venv aktif, install library
4️⃣ Menjalankan Aplikasi RDP Controller
- Buat script main.py yang menggunakan PyAutoGUI untuk mengontrol sesi RDP.
- Jalankan aplikasi dengan: bashSalinEdit
python main.py
- Pastikan aplikasi berjalan sesuai dengan yang diharapkan.
5️⃣ Konversi Aplikasi ke .EXE (Opsional)
Agar bisa dijalankan tanpa perlu install Python:
- Install PyInstaller
- Buat file .exe
- Hasilnya ada di folder
dist
, yang bisa langsung dijalankan.
🚀 Kesimpulan Akhir
✅ Aplikasi RDP Controller telah berhasil dibuat dan dijalankan dengan Python dalam Laragon.
✅ Library yang digunakan memungkinkan kontrol otomatisasi RDP secara efisien.
✅ Aplikasi dapat dikemas menjadi executable (.exe) agar lebih mudah digunakan.
Dengan langkah-langkah ini, kamu sekarang punya sistem kendali jarak jauh yang bisa digunakan sesuai kebutuhan! 💻🔥
Tag: pemrograman jaringan, Python