SISTEM TERDISTRIBUSI
“IMPLEMENTASI SOCKET COMMUNICATION”
Note : Kita mengimport beberapa modul pilihan yang akan kita gunakan untuk operasi
pemantauan tingkat OS dalam berbagai hal, termasuk untuk soket. Ini sangat berguna
dalam kasus di mana kita mencoba memantau banyak koneksi secara bersamaan.
Pengunaan select jauh lebih efisien dan berskala jauh lebih baik daripada penggunaan
for loop dalam mengulang semua socket dikarenakan akan bekerja pada lapisan OS,
daripada sepenuhnya melalui Python.
Note :
• Source code diatas digunakan untuk mengatur socket yang akan dipakai.
• socket.AF_INET : adalah kelompok address yang digunakan untuk menentukan
jenis address yang dapat berkomunikasi dengan soket (contohnya : IPv4 address).
Saat kita membuat socket, kita harus menentukan kelompok address nya, kemudian
kita hanya dapat menggunakan jenis address itu dengan soket.
• socket.SOCK_STREAM :
Note : Selanjutnya, kita dapat mengatur hal berikut untuk address yang sudah
digunakan dan mengubah socket agar dapat menggunakan kembali alamat tersebut.
• server_socket.bind((IP, PORT))
note :
- Metode bind () dari kelas soket Python memberikan alamat IP dan nomor port
ke instance soket.
- Metode bind () digunakan ketika soket perlu dijadikan soket server.
- Saat program server mendengarkan pada port yang dipublikasikan, diperlukan
port dan alamat IP untuk ditetapkan secara eksplisit ke soket server.
- Untuk program klien, tidak diperlukan untuk mengikat soket secara eksplisit ke
port. Kernel sistem operasi menangani penetapan IP sumber dan nomor port
sementara.
- Soket klien dapat menggunakan metode connect (), setelah pembuatan soket
selesai untuk menghubungi soket server.
• server_socket.listen()
note :
- Memanggil listen () membuat socket siap untuk menerima koneksi.
- Metode listen () harus dipanggil sebelum memanggil metode accept () pada
soket server.
- Fungsi listen () menerima ukuran antrian melalui parameter backlog. Ini
menunjukkan jumlah maksimum koneksi yang dapat diantrekan untuk soket ini
oleh sistem operasi. Setelah jumlah koneksi 'backlog' berada dalam antrian
soket, kernel akan menolak koneksi masuk ke soket.
Note : Source code tersebut digunakan untuk membuat list socket saat dipilh untuk
dilacak.
Note : source code ini digunakan untuk memberitahu beberapa info debugging.
Note : Source code ini dipakai untuk menerima pesan dan menyebarkan ke client yang
terhubung.
- message_header = client_socket.recv(HEADER_LENGTH)
note : source code digunakan untuk membaca header saat menerima pesan.
Note : Jika kita tidak menerima data, maka client akan menutup connection dengan
baik, maka socket.close () akan dikeluarkan dan tidak akan ada header.
Note : source code ini untuk mengubah header menjadi nilai int
Note : Selanjutnya, kita mengembalikan objek header message dan data message seperti
pada source code diatas.
Note :
Note : Source code ini akan mengulang list read_sockets dimana socket tersebut
memiliki data untuk dibaca.
Note :
- Jika soket yang diberitahukan adalah socket server, maka ini berarti kita baru
saja mendapat koneksi baru, yang ingin kita tangani.
Note : Setelah itu, kita akan menyimpan username client yang disimpan sebagai value
ke key yang merupakan socket object.
Note : Pada source code diatas, kita akan mendapat pesan jika socket yang
diberitahukan bukan socket server
Note : Sebelum kita mencoba membaca pesan tersebut, kita pastikan pesan tersebut ada.
Jika client disconnects, maka pesan akan kosong.
Note : Untuk source code ini, kita dapatkan user dengan socket yang diberitahukan
sehingga kita akan tahu siapa yang mengirim pesan.
Note : Source code ini untuk melakukan broadcast ke semua client yang terhubung.
Note : source code ini digunakan untuk menangani socket pengecualian / kesalahan.
Note :
Import errno : Modul errno mendefinisikan sejumlah kode kesalahan simbolik, seperti
ENOENT ("tidak ada entri direktori seperti itu") dan EPERM ("izin ditolak"). Ini juga
menyediakan pemetaan kamus dari kode kesalahan numerik yang bergantung pada platform ke
nama simbolik.
Note : source code ini digunakan untuk mengatur metode recv untuk tidak memblokir.
Atur mode pemblokiran atau non-pemblokiran socket: jika flag salah, socket disetel ke non-
pemblokiran, jika tidak, ke mode pemblokiran.Metode ini adalah singkatan dari panggilan
settimeout () tertentu:
Note : Setelah ini, siap untuk loop utama untuk client, yang akan ada di sana untuk menerima
new message dari client. Untuk saat ini, kita hanya akan menggunakan fungsi input dari
Python. Kita mungkin ingin memiliki semacam GUI di sini, dan masukan akan memblokir
program lainnya dari menjalankan / memperbarui message, yang berarti kita harus mengirim
message untuk melihat pembaruan.
Note : Source code ini untuk memasang username untuk memberikan tampilan dan nuansa
seperti chat app. Sebelum mengirim pesan, kita harus memastikan ada pesan. Orang mungkin
juga hanya menekan enter untuk menyegarkan dengan aplikasi ini, tetapi juga orang mungkin
secara tidak sengaja menekan enter nanti atau sesuatu. Tidak ada alasan untuk mengirim pesan
kosong.
Note : Source code ini hanyalah melakukan while True loop yang akan terus mencoba untuk
menerima pesan masuk. Setelah tidak ada lagi yang bisa diterima, kita akan mendapatkan
kesalahan. Kami akan menangani kesalahan yang diharapkan lainnya, tetapi jika kita
mendapatkan kesalahan spesifik yang kita harapkan hanya keluar dari pesan, maka kita akan
memutus loop dengan bersih dan mengulang.
Untuk menampilkan pesan, kita membutuhkan username dan message yang masing-masing
memiliki header dan konten yang terpisah, jadi kita perlu mengambil masing-masing.
- username_length = int(username_header.decode('utf-8').strip())
note : Convert header to int value
- username = client_socket.recv(username_length).decode('utf-8')
note : Receive and decode username
Note : Source code ini menggunakan logika yang sama sehingga saat kami menerima nama
pengguna, kami menerima seluruh pesan, tidak perlu memeriksa apakah panjangnya.
Note : Source code ini digunakan untuk mencetak pesan kemudian dikeluarkan ke layar.
Note :Pada source code ini, kita akan menemukan kesalahan karena tidak akan ada pesan yang
harus diterima lagi. Kita mengharapkan kesalahan ini, tetapi kita tidak ingin berasumsi hanya
untuk kesalahan ini.
Misalnya, terlepas dari apakah socket dibuat dengan opsi SOCK_STREAM atau
SOCK_DGRAM, socket dapat dibuat sebagai server dengan memanggil metode
bind () dan accept () atau metode bind () dan recvfrom (). Urutan pertama diperlukan
untuk server TCP dan urutan berikutnya diperlukan untuk server UDP.