Python socket error terjadi ketika ada kegagalan komunikasi antara program klien dan server pada tingkat jaringan transport layer (TCP/IP). Masalah ini umumnya dipicu oleh port yang tertutup, alamat IP yang salah, firewall yang memblokir akses, atau batas waktu koneksi (timeout) yang terlampaui. Penanganan error ini memerlukan blok try-except yang spesifik untuk menangkap exception seperti socket.error, ConnectionRefusedError, dan socket.timeout.
Daftar Error Socket Python yang Paling Sering Terjadi
Memahami kode dan nama exception pada modul socket sangat krusial untuk mempercepat proses debugging jaringan.
| Exception / Error | Penyebab Utama | Solusi Cepat |
|---|---|---|
ConnectionRefusedError (Errno 111) |
Server tidak aktif atau port tujuan tertutup/tidak mendengarkan (not listening). | Pastikan service server sudah berjalan dan port yang dituju sudah benar. |
socket.timeout (Errno 110) |
Waktu tunggu koneksi atau pengiriman data melebihi batas (settimeout). |
Tingkatkan nilai timeout atau periksa latensi jaringan/firewall. |
gaierror (Errno -2 / -3) |
Gagal resolusi DNS (Address-related error). Nama host tidak ditemukan. | Periksa penulisan domain/hostname atau koneksi DNS lokal. |
OSError: [Errno 98] Address already in use |
Port yang sama masih digunakan oleh proses lain yang belum tertutup sempurna. | Gunakan opsi SO_REUSEADDR atau matikan proses yang menggunakan port tersebut. |
Contoh Penanganan Error Socket (Exception Handling)
Berikut adalah implementasi kode Python standar untuk menangkap berbagai jenis exception socket secara aman agar program tidak mengalami crash mendadak.
import socket
def connect_to_server(host, port):
try:
# Membuat objek socket TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5.0) # Set timeout 5 detik
# Mencoba menghubungkan ke server
s.connect((host, port))
print(f"Berhasil terhubung ke {host}:{port}")
# Kirim data contoh
s.sendall(b"PING")
response = s.recv(1024)
print(f"Menerima: {response}")
except ConnectionRefusedError:
print(f"[Error] Koneksi ditolak. Pastikan server di {host}:{port} sedang berjalan.")
except socket.timeout:
print(f"[Error] Koneksi ke {host}:{port} mengalami timeout.")
except socket.gaierror as e:
print(f"[Error] Gagal melakukan resolve hostname: {e}")
except OSError as e:
print(f"[Error] Kesalahan sistem operasi: {e}")
finally:
# Pastikan socket selalu ditutup
try:
s.close()
except NameError:
pass
if __name__ == "__main__":
connect_to_server("127.0.0.1", 8080)
Cara Mengatasi Error Address Already in Use
Jika Anda sering mendapati error Address already in use saat menjalankan ulang skrip server Python, hal ini terjadi karena sistem operasi masih mempertahankan status TIME_WAIT pada port tersebut. Tambahkan baris pengatur soket berikut sebelum melakukan bind():
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Mengizinkan penggunaan kembali port yang sama seketika
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', 8080))
server.listen(5)
Troubleshooting Jaringan dan Firewall
Jika kode Python sudah benar namun masih terjadi error timeout atau connection refused, lakukan pemeriksaan fisik dan sistem berikut:
- Uji Port dengan Netcat: Gunakan perintah terminal
nc -zv [IP_HOST] [PORT]untuk memastikan apakah jalur jaringan terbuka. - Pengaturan Firewall (UFW / iptables): Pada sistem Linux, pastikan port yang digunakan diizinkan melalui perintah
sudo ufw allow [PORT]/tcp. - Binding IP yang Tepat: Gunakan
'0.0.0.0'pada server socket jika ingin menerima koneksi dari semua interface jaringan, atau'127.0.0.1'jika hanya untuk pengujian lokal (localhost).