Anda di halaman 1dari 15

PRAKTIKUM I

SISTEM TERDISTRIBUSI
“IMPLEMENTASI SOCKET COMMUNICATION”

Nama : Aurelia Vitania Rusli


Kelas : 3C
NIM : 42518059

Jurusan Teknik Elektro


Program Studi Tekink Komputer dan Jaringan
I. Hasil dan Analisa
❖ SERVER - CHATROOM
Sebelum membuat server - chatroom, kita harus mengetahui fungsi server yang akan
dibuat. Pertama, server perlu menerima koneksi baru dari client. Selanjutnya, kita perlu
menemukan beberapa cara untuk mengidentifikasi unique users. Kita dapat
menampilkan users berdasarkan IP address, tetapi kebanyakan orang cenderung
memilih username, jadi server kita akan mengizinkan client untuk connect dan memilih
username terlebih dahulu. Setelah itu, server akan mengumpulkan messages masuk dan
kemudian mendistribusikannya ke client lain yang connected.

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.

• SO_ : pilihan / opsi socket


• SOL_ : tingkat opsi socket
• Set REUSEADDR (sebagai opsi socket) ke 1 pada socket
Opsi socket SO_REUSEADDR memungkinkan soket untuk mengikat secara
paksa ke port yang digunakan oleh soket lain. Soket kedua memanggil
setsockopt dengan parameter optname disetel ke SO_REUSEADDR dan
parameter optval disetel ke nilai boolean TRUE sebelum memanggil bind pada
port yang sama dengan soket asli. Setelah soket kedua berhasil terikat, perilaku
untuk semua soket yang terikat ke port itu tidak dapat ditentukan.
Note : source code selanjutnya kita melakukan bind dan listen.

• 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 :

- Langkah selanjutnya adalah melakukan putaran yang berkelanjutan, menerima


pesan untuk semua socket client, kemudian mengirim semua pesan ke semua
socket client. Untuk memulai, kita akan menggunakan loop sementara dan
kemudian kita akan menggunakan select.select.
- Fungsi select.select.berfungsi untuk mengambil parameter sebagai rlist, wlist,
dan xlist yang masing-masing merupakan daftar baca, daftar tulis, dan daftar
kesalahan. Kembalinya fungsi ini adalah 3 elemen yang sama di mana
pengembaliannya adalah "subset" dari daftar input di mana subsetnya adalah
list socket yang siap.

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.

- Jadi dengan client_socket, client_address = server_socket.accept() kita


mendapatkan unique client socket dan address nya. Kemudian, menyimpan
username pilihan ke yang dipilih dan ini menjadi hal pertama yang akan dikirim
klien. Jika karena alasan tertentu, itu tidak akan terjadi (seperti client ditutup
sebelum mengirim nama), maka kita hanya akan melanjutkan.
Note : Dalam source code ini, kita melakukan penambahan client_socket baru ke
sockets_list.

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.

- client_socket.send(user['header'] + user['data'] + message['header'] +


message['data'])
note :
• Kita menggunakan kembali message header yang dikirim oleh sender, dan
username header yang disimpan yang dikirim oleh user ketika terhubung

Note : source code ini digunakan untuk menangani socket pengecualian / kesalahan.

- for notified_socket in exception_sockets:


note : digunakan untuk menangani beberapa pengecualian socket untuk berjaga-
jaga
- sockets_list.remove(notified_socket)
note : menghapus dari list untuk socket.socket ()
- del clients[notified_socket]
note : menghapus dari list users
❖ CLIENT – CHATROOM

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:

1. sock.setblocking (True) setara dengan sock.settimeout (None)


2. sock.setblocking (False) setara dengan sock.settimeout (0.0)
Note : Jika kita recall maka server tersebut mengharapkan message pertama menjadi pilhan
username untuk client seperti pada source code diatas.

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.

Note : Source code ini, kita sudah benar-benar mendapatkan username

- 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.

II. Tampilan Eksekusi


III. Kesimpulan
Fungsi socket mengembalikan objek socket baru. Socket adalah titik akhir
komunikasi. Socket yang dikembalikan dengan metode ini dapat dibuat menjadi
socket server atau socket client dengan menyesuaikannya lebih lanjut.

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.

Anda mungkin juga menyukai