Membuat program chatting sederhana di C++ dapat dilakukan dengan pendekatan berbasis terminal menggunakan soket jaringan untuk komunikasi antar komputer, atau secara lokal dengan simulasi percakapan antar pengguna dalam program. Di sini, kita akan membuat dua versi:
- Simulasi Chatting Lokal di Terminal.
- Chatting Berbasis Jaringan dengan Soket (TCP/IP).
1. Simulasi Chatting Lokal di Terminal
Program ini mensimulasikan dua pengguna yang bergantian mengetik pesan di terminal.
Kode
#include <iostream>
#include <string>
using namespace std;
int main() {
string pesan;
string pengguna1, pengguna2;
cout << "Masukkan nama Pengguna 1: ";
getline(cin, pengguna1);
cout << "Masukkan nama Pengguna 2: ";
getline(cin, pengguna2);
cout << "\nSimulasi chatting dimulai! Ketik \"keluar\" untuk mengakhiri.\n\n";
while (true) {
// Pengguna 1
cout << pengguna1 << ": ";
getline(cin, pesan);
if (pesan == "keluar") {
cout << pengguna1 << " keluar dari obrolan.\n";
break;
}
cout << pengguna1 << " mengatakan: " << pesan << "\n";
// Pengguna 2
cout << pengguna2 << ": ";
getline(cin, pesan);
if (pesan == "keluar") {
cout << pengguna2 << " keluar dari obrolan.\n";
break;
}
cout << pengguna2 << " mengatakan: " << pesan << "\n";
}
cout << "\nObrolan selesai. Terima kasih telah menggunakan program ini!\n";
return 0;
}
Penjelasan
- Program ini memungkinkan dua pengguna untuk bergantian mengetik pesan.
- Ketik
keluar
untuk mengakhiri sesi chatting.
Output
Masukkan nama Pengguna 1: Alice
Masukkan nama Pengguna 2: Bob
Simulasi chatting dimulai! Ketik "keluar" untuk mengakhiri.
Alice: Hai, Bob!
Alice mengatakan: Hai, Bob!
Bob: Hai, Alice. Apa kabar?
Bob mengatakan: Hai, Alice. Apa kabar?
Alice: Keluar
Alice keluar dari obrolan.
Obrolan selesai. Terima kasih telah menggunakan program ini!
2. Chatting Berbasis Jaringan (TCP/IP)
Untuk membuat chatting berbasis jaringan, kita membutuhkan pustaka untuk soket. Di sistem Linux/Unix, Anda dapat menggunakan <sys/socket.h>
dan <netinet/in.h>
. Berikut adalah contoh sederhana.
Server
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
using namespace std;
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// Membuat socket file descriptor
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0) {
perror("Socket gagal");
return 1;
}
// Memasang opsi untuk socket
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// Menentukan alamat dan port
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// Mengikat socket
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
// Mendengarkan koneksi
listen(server_fd, 3);
cout << "Menunggu koneksi...\n";
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);
cout << "Koneksi diterima!\n";
char buffer[1024] = {0};
while (true) {
memset(buffer, 0, sizeof(buffer));
read(new_socket, buffer, 1024);
if (strcmp(buffer, "keluar") == 0) {
cout << "Obrolan selesai.\n";
break;
}
cout << "Pesan diterima: " << buffer << "\n";
cout << "Balasan: ";
string balasan;
getline(cin, balasan);
send(new_socket, balasan.c_str(), balasan.length(), 0);
}
close(server_fd);
return 0;
}
Client
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
// Membuat socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
cout << "Socket gagal dibuat.\n";
return 1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
// Menghubungkan ke server
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
cout << "Alamat tidak valid.\n";
return 1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
cout << "Koneksi gagal.\n";
return 1;
}
char buffer[1024] = {0};
while (true) {
cout << "Pesan: ";
string pesan;
getline(cin, pesan);
send(sock, pesan.c_str(), pesan.length(), 0);
if (pesan == "keluar") {
cout << "Obrolan selesai.\n";
break;
}
memset(buffer, 0, sizeof(buffer));
read(sock, buffer, 1024);
cout << "Balasan: " << buffer << "\n";
}
close(sock);
return 0;
}
Penjelasan
- Server:
- Mendengarkan koneksi pada port 8080.
- Membaca pesan dari klien dan mengirim balasan.
- Client:
- Menghubungkan ke server lokal (
127.0.0.1
). - Mengirim pesan dan menerima balasan dari server.
- Menghubungkan ke server lokal (
Menjalankan Program
- Jalankan server terlebih dahulu.
- Jalankan klien di terminal lain.
- Klien mengirim pesan, dan server membalas.
Catatan
- Untuk program berbasis jaringan:
- Gunakan sistem operasi berbasis Unix/Linux.
- Perlu pengaturan jaringan tambahan jika ingin berjalan di dua perangkat berbeda.
- Untuk implementasi lebih kompleks, gunakan pustaka seperti Boost.Asio untuk soket atau Qt untuk antarmuka grafis.
Jika Anda memerlukan penjelasan tambahan, beri tahu saya! 😊
Leave a Reply