PYTHON

Cara Membuat Aplikasi Chat Sederhana Dengan Python

Pendahuluan

Ruang obrolan adalah antarmuka yang memungkinkan dua orang atau lebih untuk mengobrol dan mengirim pesan ke semua orang di dalam ruangan. Dalam tutorial ini, Anda akan belajar cara membangun server ruang obrolan sederhana dan mengizinkan banyak klien untuk terhubung menggunakan soket dengan Python. Kita akan menggunakan modul soket yang disertakan dengan Python dan memberi kita operasi soket yang banyak digunakan di Internet, karena mereka berada di belakang koneksi apa pun ke jaringan apa pun. Untuk memulai, dan untuk mengubah warna teks , kita memerlukan paket colorama untuk menetapkan warna pencetakan ke setiap klien di ruang obrolan:

pip3 install colorama

Karena kita menggunakan soket, maka kita memerlukan server dan kode klien, mari kita mulai dengan sisi server.

Kode Server

Dalam arsitektur kami, seluruh tugas server adalah melakukan dua operasi penting:

  • Mendengarkan koneksi klien yang akan datang, jika klien baru terhubung, kami menambahkannya ke koleksi soket klien kami.
  • Mulai utas baru untuk setiap klien yang terhubung yang terus mendengarkan pesan mendatang yang dikirim dari klien dan menyiarkannya ke semua klien lain.

Kode di bawah ini membuat soket TCP dan mengikatnya ke alamat server, dan kemudian mendengarkan koneksi yang akan datang:

import socket
from threading import Thread

# alamat IP server
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5002 # port yang ingin kita gunakan
separator_token = "<SEP>" # kami akan menggunakan ini untuk memisahkan nama & pesan klien

# inisialisasi daftar/set semua soket klien yang terhubung
client_sockets = set()
# buat soket TCP
s = socket.socket()
# jadikan port sebagai port yang dapat digunakan kembali
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# ikat soket ke alamat yang kami tentukan
s.bind((SERVER_HOST, SERVER_PORT))
# dengarkan untuk koneksi yang akan datang
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")

Perhatikan saya telah menggunakan "0.0.0.0" sebagai alamat IP server. ini berarti semua alamat IPv4 di mesin lokal. Anda mungkin bertanya-tanya, mengapa kami tidak menggunakan localhost atau "127.0.0.1" saja ? Nah, jika server memiliki dua alamat IP, misalkan "192.168.1.2" di jaringan dan "10.0.0.1" di jaringan lain, maka server mendengarkan di kedua jaringan.

Kami belum menerima koneksi, karena kami tidak memanggil accept() metode, kode di bawah ini menyelesaikan resep kode server:

def listen_for_client(cs):
    """
    Fungsi ini terus mendengarkan pesan dari soket `cs`
    Setiap kali pesan diterima, siarkan ke semua klien lain yang terhubung
    """
    while True:
        try:
            # terus dengarkan pesan dari soket `cs`
            msg = cs.recv(1024).decode()
        except Exception as e:
            # klien tidak lagi terhubung
            # hapus dari set
            print(f"[!] Error: {e}")
            client_sockets.remove(cs)
        else:
            # jika kami menerima pesan, ganti <SEP>
            # token dengan ": " untuk pencetakan yang bagus
            msg = msg.replace(separator_token, ": ")
        # ulangi semua soket yang terhubung
        for client_socket in client_sockets:
            # dan kirim pesan
            client_socket.send(msg.encode())

while True:
    # kami terus mendengarkan koneksi baru setiap saat
    client_socket, client_address = s.accept()
    print(f"[+] {client_address} connected.")
    # tambahkan klien baru yang terhubung ke soket yang terhubung
    client_sockets.add(client_socket)
    # memulai utas baru yang mendengarkan pesan setiap klien
    t = Thread(target=listen_for_client, args=(client_socket,))
    # buat daemon utas sehingga berakhir setiap kali utas utama berakhir
    t.daemon = True
    # mulai threadnya
    t.start()

Seperti disebutkan sebelumnya, kami menambahkan soket klien yang terhubung ke kumpulan soket kami, dan kemudian kami memulai utas baru dan kami menetapkannya sebagai utas daemon yang menjalankan fungsi yang kami tentukan listen_for_client(), yang diberi soket klien, ia menunggu pesan dikirim menggunakan recv() metode, jika demikian, maka ia mengirimkannya ke semua klien lain yang terhubung.

Akhirnya, mari kita tutup semua soket:

# tutup soket klien
for cs in client_sockets:
    cs.close()
# tutup soket server
s.close()

Baiklah, itu saja untuk kode server, mari selami kode klien.

Kode Klien

Klien melakukan tiga operasi dasar:

  • Terhubung ke server.
  • Tetap mendengarkan pesan yang datang dari server (harus klien mengirim pesan ke server dan server menyiarkannya) dan mencetaknya ke konsol.
  • Menunggu pengguna memasukkan pesan untuk dikirim ke server.

Berikut kode untuk operasi pertama:

import socket
import random
from threading import Thread
from datetime import datetime
from colorama import Fore, init, Back

# warna init
init()

# atur warna yang tersedia
colors = [Fore.BLUE, Fore.CYAN, Fore.GREEN, Fore.LIGHTBLACK_EX, 
    Fore.LIGHTBLUE_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTGREEN_EX, 
    Fore.LIGHTMAGENTA_EX, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX, 
    Fore.LIGHTYELLOW_EX, Fore.MAGENTA, Fore.RED, Fore.WHITE, Fore.YELLOW
]

# pilih warna acak untuk klien
client_color = random.choice(colors)

# alamat IP server
# jika server tidak ada di mesin ini, 
# masukkan alamat IP pribadi (jaringan) (mis. 192.168.1.2)
SERVER_HOST = "127.0.0.1"
SERVER_PORT = 5002 # server's port
separator_token = "<SEP>" # kami akan menggunakan ini untuk memisahkan nama & pesan klien

# inisialisasi soket TCP
s = socket.socket()
print(f"[*] Connecting to {SERVER_HOST}:{SERVER_PORT}...")
# terhubung ke server
s.connect((SERVER_HOST, SERVER_PORT))
print("[+] Connected.")

Sebagai operasi sampingan, kami juga menetapkan warna untuk setiap klien, Anda akan melihatnya di output. Juga, mari kita tetapkan nama untuk setiap klien, sehingga kita dapat membedakan antara klien:

# prompt untuk nama klien
name = input("Enter your name: ")

Kode di bawah ini bertanggung jawab untuk operasi kedua; terus mendengarkan pesan dari server dan mencetaknya ke konsol:

def listen_for_messages():
    while True:
        message = s.recv(1024).decode()
        print("\n" + message)

# buat utas yang mendengarkan pesan ke klien ini & mencetaknya
t = Thread(target=listen_for_messages)
# buat daemon utas sehingga berakhir setiap kali utas utama berakhir
t.daemon = True
# mulai threadnya
t.start()

Kami juga ingin itu berada di utas terpisah sebagai utas daemon , sehingga kami dapat melakukan hal-hal lain sambil mendengarkan pesan. Sekarang mari kita lakukan tugas terakhir; menunggu input pengguna untuk pesan, dan kemudian mengirimkannya ke server:

while True:
    # masukan pesan yang ingin kita kirim ke server
    to_send =  input()
    # cara untuk keluar dari program
    if to_send.lower() == 'q':
        break
    # tambahkan tanggal, nama & warna pengirim
    date_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
    to_send = f"{client_color}[{date_now}] {name}{separator_token}{to_send}{Fore.RESET}"
    # akhirnya, kirim pesan
    s.send(to_send.encode())

# tutup soketnya
s.close()

Kami menambahkan warna klien, nama, dan tanggal-waktu saat ini ke pesan yang akan dikirim, kami mengirim pesan menggunakan send() metode dan kami membuat cara untuk keluar dari masalah, dengan hanya memasukkan 'q' karakter di tempat pesan.

Demonstrasi

Baiklah, sekarang setelah kita menyelesaikan kedua resep kode, mari kita buat demonstrasi. Pertama, mari kita jalankan satu dan hanya satu contoh server:

Luar biasa, server sedang mendengarkan koneksi klien yang akan datang, mari coba jalankan satu instance klien:

Sekarang klien terhubung ke server dan diminta untuk nama pengguna, untuk memastikan itu terhubung, kembali ke konsol server dan Anda akan melihat memang terhubung:

Perhatikan bahwa kami berada di alamat localhost ( 127.0.0.1 ) untuk saat ini, karena ini adalah mesin yang sama, tetapi jika Anda ingin terhubung dari mesin lain di jaringan yang sama, Anda juga dapat melakukannya, pastikan untuk mengubah SERVER_HOST kode klien dari 127.0.0.1 ke alamat IP pribadi server.

Mari kita jalankan klien lain sehingga kita bisa mengobrol:

Luar biasa, seperti yang Anda lihat, setiap klien memiliki warna sehingga kami dapat membedakan antara pengguna, mari jalankan klien ketiga untuk bersenang-senang:

Kesimpulan

Hebat, sekarang setiap pesan yang dikirim dari klien tertentu dikirim ke semua klien lain. Perhatikan warna berubah setiap kali Anda menjalankan kembali skrip client.py . Silakan periksa kode lengkapnya sehingga Anda dapat dengan mudah menjalankannya sendiri! Saya mendorong Anda untuk menambahkan lebih banyak fitur ke program ini. Misalnya, Anda dapat membuat pemberitahuan kepada semua pengguna saat klien baru terhubung!

Sumber asli : thepythoncode