Cara Baru Membuat Chat Room Multi Client Dengan Python

Artikel ini menunjukkan - Cara mengatur server Chat Room sederhana dan memungkinkan banyak Client untuk terhubung menggunakan skrip sisi Client. Kode menggunakan konsep soket dan threading.

Pemrograman soket

Soket dapat dianggap sebagai titik akhir dalam saluran komunikasi yang bersifat dua arah, dan membangun komunikasi antara server dan satu atau lebih klien. Di sini, kami menyiapkan soket di setiap ujung dan memungkinkan klien untuk berinteraksi dengan klien lain melalui server. Soket di sisi server mengasosiasikan dirinya dengan beberapa port perangkat keras di sisi server. Setiap klien yang memiliki soket yang terkait dengan port yang sama dapat berkomunikasi dengan soket server.

Multi-Threading

Utas adalah sub proses yang menjalankan serangkaian perintah secara terpisah dari utas lainnya. Jadi, setiap kali pengguna terhubung ke server, utas terpisah dibuat untuk pengguna itu dan komunikasi dari server ke klien berlangsung di sepanjang utas individu berdasarkan objek soket yang dibuat demi identitas masing-masing klien. 

Kami akan membutuhkan dua skrip untuk membuat ruang obrolan ini. Satu untuk menjaga penayangan tetap berjalan, dan lainnya yang harus dijalankan setiap klien untuk terhubung ke server.

Skrip Sisi Server

Skrip sisi server akan berusaha membuat soket dan mengikatnya ke alamat IP dan port yang ditentukan oleh pengguna (pengguna windows mungkin harus membuat pengecualian untuk nomor port yang ditentukan dalam pengaturan firewall mereka, atau lebih baik dapat menggunakan port yang sudah terbuka). Skrip kemudian akan tetap terbuka dan menerima permintaan koneksi, dan akan menambahkan objek soket masing-masing ke daftar untuk melacak koneksi aktif. Setiap kali pengguna terhubung, 

utas terpisah akan dibuat untuk pengguna itu. Di setiap utas, server menunggu pesan, dan mengirim pesan itu ke pengguna lain yang sedang mengobrol. Jika server menemukan kesalahan saat mencoba menerima pesan dari utas tertentu, itu akan keluar dari utas itu.

Pemakaian

Server ini dapat diatur pada jaringan area lokal dengan memilih sembarang komputer untuk menjadi node server, dan menggunakan alamat IP pribadi komputer tersebut sebagai alamat IP server. 

Misalnya, jika jaringan area lokal memiliki satu set alamat IP pribadi yang ditetapkan mulai dari 192.168.1.2 hingga 192.168.1.100, maka komputer apa pun dari 99 node ini dapat bertindak sebagai server, dan node yang tersisa dapat terhubung ke node server dengan menggunakan alamat IP pribadi server. Harus diperhatikan untuk memilih port yang saat ini tidak digunakan. Sebagai contoh, port 22 adalah default untuk ssh, dan port 80 adalah default untuk protokol HTTP. Jadi kedua port ini sebaiknya, tidak boleh digunakan atau dikonfigurasi ulang untuk membuatnya bebas untuk digunakan.
Namun, jika server dimaksudkan untuk dapat diakses di luar jaringan lokal, alamat IP publik akan diperlukan untuk penggunaan. Ini akan memerlukan port forwarding dalam kasus di mana sebuah node dari jaringan lokal (node ​​yang bukan router) ingin meng-host server. Dalam hal ini, saya akan meminta semua permintaan yang datang ke alamat IP publik untuk dialihkan ke alamat IP pribadi saya di jaringan lokal saya, dan karenanya akan memerlukan penerusan port. 


/ * Baik skrip server dan klien kemudian dapat dijalankan 
   dari Command prompt (di Windows) atau dari bash 
   Terminal (pengguna Linux) hanya dengan mengetik 
   "python chat_server.py" atau "python client.py". 
   Sebagai contoh, * / 
python chat_server.py 192.168.55.13 8081 
python client.py 192.168.55.13 8081

Di bawah ini adalah skrip sisi Server yang harus dijalankan setiap saat akan menjalankan Chat Room tetap berjalan.

# Python program to implement server side of chat room. 
import socket 
import select 
import sys 
from thread import *

"""The first argument AF_INET is the address domain of the 
socket. This is used when we have an Internet Domain with 
any two hosts The second argument is the type of socket. 
SOCK_STREAM means that data or characters are read in 
a continuous flow."""
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

# checks whether sufficient arguments have been provided 
if len(sys.argv) != 3: 
print "Correct usage: script, IP address, port number"
exit() 

# takes the first argument from command prompt as IP address 
IP_address = str(sys.argv[1]) 

# takes second argument from command prompt as port number 
Port = int(sys.argv[2]) 

""" 
binds the server to an entered IP address and at the 
specified port number. 
The client must be aware of these parameters 
"""
server.bind((IP_address, Port)) 

""" 
listens for 100 active connections. This number can be 
increased as per convenience. 
"""
server.listen(100) 

list_of_clients = [] 

def clientthread(conn, addr): 

# sends a message to the client whose user object is conn 
conn.send("Welcome to this chatroom!") 

while True: 
try: 
message = conn.recv(2048) 
if message: 

"""prints the message and address of the 
user who just sent the message on the server 
terminal"""
print "<" + addr[0] + "> " + message 

# Calls broadcast function to send message to all 
message_to_send = "<" + addr[0] + "> " + message 
broadcast(message_to_send, conn) 

else: 
"""message may have no content if the connection 
is broken, in this case we remove the connection"""
remove(conn) 

except: 
continue

"""Using the below function, we broadcast the message to all 
clients who's object is not the same as the one sending 
the message """
def broadcast(message, connection): 
for clients in list_of_clients: 
if clients!=connection: 
try: 
clients.send(message) 
except: 
clients.close() 

# if the link is broken, we remove the client 
remove(clients) 

"""The following function simply removes the object 
from the list that was created at the beginning of 
the program"""
def remove(connection): 
if connection in list_of_clients: 
list_of_clients.remove(connection) 

while True: 

"""Accepts a connection request and stores two parameters, 
conn which is a socket object for that user, and addr 
which contains the IP address of the client that just 
connected"""
conn, addr = server.accept() 

"""Maintains a list of clients for ease of broadcasting 
a message to all available people in the chatroom"""
list_of_clients.append(conn) 

# prints the address of the user that just connected 
print addr[0] + " connected"

# creates and individual thread for every user 
# that connects 
start_new_thread(clientthread,(conn,addr))  

conn.close() 

server.close() 

Skrip Sisi Klien

Skrip sisi klien hanya akan mencoba mengakses soket server yang dibuat pada alamat dan port IP yang ditentukan. Setelah terhubung, ia akan terus memeriksa apakah input berasal dari server atau dari klien, dan karenanya mengarahkan kembali output. Jika input dari server, ini menampilkan pesan di terminal. Jika input dari pengguna, ia mengirimkan pesan bahwa pengguna masuk ke server untuk disiarkan ke pengguna lain.

Ini adalah skrip sisi klien, yang harus digunakan setiap pengguna untuk terhubung ke server.

# Python program to implement client side of chat room. 
import socket 
import select 
import sys 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
if len(sys.argv) != 3: 
print "Correct usage: script, IP address, port number"
exit() 
IP_address = str(sys.argv[1]) 
Port = int(sys.argv[2]) 
server.connect((IP_address, Port)) 

while True: 

# maintains a list of possible input streams 
sockets_list = [sys.stdin, server] 

""" There are two possible input situations. Either the 
user wants to give manual input to send to other people, 
or the server is sending a message to be printed on the 
screen. Select returns from sockets_list, the stream that 
is reader for input. So for example, if the server wants 
to send a message, then the if condition will hold true 
below.If the user wants to send a message, the else 
condition will evaluate as true"""
read_sockets,write_socket, error_socket = select.select(sockets_list,[],[]) 

for socks in read_sockets: 
if socks == server: 
message = socks.recv(2048) 
print message 
else: 
message = sys.stdin.readline() 
server.send(message) 
sys.stdout.write("<You>") 
sys.stdout.write(message) 
sys.stdout.flush() 
server.close() 

Output: Pada gambar yang diberikan di bawah ini, server telah diinisialisasi di sisi kiri terminal dan skrip klien di sisi kanan terminal. (Pemisahan terminal dilakukan dengan menggunakan tmux, 'sudo apt-get install tmux'). Untuk keperluan inisialisasi, Anda dapat melihat bahwa setiap kali pesan dikirim oleh pengguna, pesan bersama dengan alamat IP ditampilkan di sisi server.


Gambar di bawah ini memiliki percakapan dasar antara dua orang di server yang sama. Banyak klien dapat terhubung ke server dengan cara yang sama!


Sekian Tutorial dari saya...
Silakan tulis komentar jika Anda menemukan sesuatu yang salah, atau Anda ingin berbagi informasi lebih lanjut tentang topik yang dibahas di atas.

Belum ada Komentar untuk "Cara Baru Membuat Chat Room Multi Client Dengan Python"

Posting Komentar

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel