Panduan Implementasi TCP Socket Python: Server dan Client

Dasar Komunikasi TCP Socket di Python

TCP (Transmission Control Protocol) adalah protokol berorientasi koneksi yang menjamin pengiriman data yang andal antara dua titik (endpoint). Dalam Python, modul socket menyediakan antarmuka tingkat rendah untuk mengakses API socket sistem operasi. Komunikasi TCP memerlukan proses 'handshake' (three-way handshake) sebelum data dapat dipertukarkan, memastikan integritas data.

Struktur Dasar Server dan Client

Untuk membangun aplikasi berbasis TCP, Anda memerlukan dua entitas: Server yang mendengarkan (listening) pada port tertentu, dan Client yang melakukan inisiasi koneksi ke alamat IP dan port server tersebut.

Contoh Implementasi Server

import socket

def start_server():
    host = '127.0.0.1'
    port = 65432
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"Server mendengarkan di {host}:{port}")
        conn, addr = s.accept()
        with conn:
            print(f"Terhubung dengan {addr}")
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)

if __name__ == '__main__':
    start_server()

Contoh Implementasi Client

import socket

def start_client():
    host = '127.0.0.1'
    port = 65432
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(b'Halo, Server!')
        data = s.recv(1024)
    print(f"Diterima dari server: {data.decode()}")

if __name__ == '__main__':
    start_client()

Tabel Perbandingan Metode Socket

MetodeFungsi
socket.socket()Membuat objek socket baru
bind()Mengikat socket ke alamat dan port
listen()Mulai mendengarkan koneksi masuk
accept()Menerima koneksi baru
connect()Memulai koneksi ke server
sendall()Mengirim data ke socket
recv()Menerima data dari socket

Tips Troubleshooting Lapangan

  • Address already in use: Sering terjadi jika server dimatikan paksa. Gunakan s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sebelum bind().
  • Timeout: Pastikan firewall tidak memblokir port yang digunakan (misal: 65432).
  • Blocking: Secara default, recv() bersifat memblokir. Gunakan setblocking(False) atau modul selectors untuk aplikasi non-blocking/asinkron.
  • Encoding: Ingat bahwa socket mengirim data dalam bentuk bytes, bukan string. Selalu gunakan .encode('utf-8') dan .decode('utf-8').