◆ Dasar-dasar soket
PHP menggunakan perpustakaan soket Berkley untuk membuat koneksinya. Soket tidak lebih dari struktur data. Anda menggunakan struktur data soket ini untuk memulai sesi antara klien dan server. Server ini selalu mendengarkan dan bersiap untuk menghasilkan sesi baru. Ketika klien terhubung ke server, ia membuka port di mana server mendengarkan suatu sesi. Pada saat ini, server menerima permintaan koneksi klien dan kemudian melakukan siklus. Sekarang klien dapat mengirimkan informasi ke server, dan server dapat mengirimkan informasi ke klien.
Untuk menghasilkan Socket, Anda memerlukan tiga variabel: protokol, tipe soket, dan tipe protokol publik. Ada tiga protokol yang dapat dipilih saat membuat soket. Lanjutkan membaca di bawah untuk mendapatkan konten protokol terperinci.
Mendefinisikan jenis protokol publik merupakan elemen penting dari koneksi. Pada tabel di bawah ini kita melihat jenis protokol umum.
Tabel 1: Nama Protokol/Deskripsi Konstan
AF_INET Ini adalah protokol yang digunakan oleh sebagian besar soket, menggunakan TCP atau UDP untuk transmisi, dan digunakan dalam alamat IPv4.
AF_INET6 mirip dengan yang di atas, tetapi digunakan untuk alamat IPv6.
Protokol lokal AF_UNIX, digunakan pada sistem Unix dan Linux. Jarang digunakan. Biasanya digunakan ketika klien dan server berada pada mesin yang sama
SOCK_STREAM Protokol ini adalah koneksi berbasis aliran byte yang berurutan, andal, dan terintegrasi dengan data. Ini adalah jenis soket yang paling umum digunakan. Soket ini menggunakan TCP untuk transmisi.
SOCK_DGRAM Protokol ini adalah panggilan transfer dengan panjang tetap dan tanpa koneksi. Protokol ini tidak dapat diandalkan dan menggunakan UDP untuk koneksinya.
SOCK_SEQPACKET Protokol ini adalah koneksi dua jalur yang andal yang mengirimkan paket data dengan panjang tetap untuk transmisi. Paket ini harus diterima sepenuhnya sebelum dapat dibaca.
SOCK_RAW Jenis soket ini menyediakan akses jaringan tunggal. Jenis soket ini menggunakan protokol publik ICMP. (ping dan traceroute menggunakan protokol ini)
SOCK_RDM Jenis ini jarang digunakan dan tidak diterapkan pada sebagian besar sistem operasi. Jenis ini disediakan untuk digunakan oleh lapisan data link dan tidak menjamin urutan paket
Protokol Pesan Kontrol Internet ICMP, terutama digunakan pada gateway dan host untuk memeriksa kondisi jaringan dan melaporkan pesan kesalahan
Protokol Datagram Pengguna UDP, yang merupakan protokol transmisi tanpa koneksi dan tidak dapat diandalkan
Protokol Kontrol Transmisi TCP, yang merupakan protokol publik andal yang paling umum digunakan, dapat memastikan bahwa paket data dapat sampai ke penerima. Jika terjadi kesalahan selama proses transmisi, maka paket kesalahan tersebut akan dikirim ulang.
Sekarang setelah Anda mengetahui tiga elemen yang menghasilkan soket, kita menggunakan fungsi socket_create() di PHP untuk menghasilkan soket. Fungsi socket_create() ini memerlukan tiga parameter: protokol, jenis soket, dan protokol publik. Fungsi socket_create() mengembalikan tipe sumber daya yang berisi soket jika berhasil dijalankan.
Sumber daya socket_create(int protokol, int socketType, int commonProtocol);
Sekarang Anda membuat soket, lalu apa? PHP menyediakan beberapa fungsi untuk memanipulasi soket. Anda dapat mengikat soket ke IP, mendengarkan komunikasi soket, dan menerima soket; sekarang mari kita lihat contoh untuk memahami bagaimana fungsi menghasilkan, menerima, dan mendengarkan soket.
<?php
$commonProtocol = getprotobyname("tcp");//Gunakan nama protokol publik untuk mendapatkan tipe protokol
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);//Buat soket dan kembalikan instance sumber daya soket
socket_bind($socket, 'localhost', 1337);//Mengikat soket ke komputer lokal
socket_listen($socket);//Dengarkan semua koneksi soket yang masuk
// Fungsi soket lainnya akan datang
?>
Contoh di atas menghasilkan sisi server Anda sendiri. Contoh baris pertama,
$commonProtocol = getprotobyname("tcp");
Gunakan nama protokol publik untuk mendapatkan jenis protokol. Protokol publik TCP digunakan di sini. Jika Anda ingin menggunakan protokol UDP atau ICMP, Anda harus mengubah parameter fungsi getprotobyname() menjadi "udp" atau "icmp". Alternatif lain adalah dengan menentukan SOL_TCP atau SOL_UDP dalam fungsi socket_create() alih-alih menggunakan fungsi getprotobyname().
$soket = soket_buat(AF_INET, SOCK_STREAM, SOL_TCP);
Baris kedua dari contoh ini membuat soket dan mengembalikan instance sumber daya soket. Setelah Anda memiliki sumber daya soket, Anda harus mengikat soket ke alamat IP dan port.
socket_bind($soket, 'localhost', 1337);
Di sini Anda mengikat soket ke komputer lokal (127.0.0.1) dan mengikat soket ke port 1337 Anda. Maka Anda perlu mendengarkan semua koneksi soket yang masuk.
socket_listen($soket);
Setelah baris keempat, Anda perlu memahami semua fungsi soket dan penggunaannya.
Tabel 4: Deskripsi nama fungsi fungsi soket
socket_accept() menerima koneksi Socket
socket_bind() mengikat soket ke alamat IP dan port
socket_clear_error() menghapus kesalahan soket atau kode kesalahan terakhir
socket_close() menutup sumber daya soket
socket_connect() memulai koneksi soket
socket_create_listen() membuka soket yang mendengarkan pada port yang ditentukan
socket_create_pair() menghasilkan sepasang soket yang tidak dapat dibedakan ke dalam sebuah array
socket_create() menghasilkan soket, yang setara dengan menghasilkan struktur data soket
socket_get_option() Dapatkan opsi soket
socket_getpeername() Mendapatkan alamat IP dari host serupa jarak jauh
socket_getsockname() mendapatkan alamat IP soket lokal
socket_iovec_add() menambahkan vektor baru ke array sebar/agregat
socket_iovec_alloc() Fungsi ini membuat struktur data iovec yang dapat mengirim, menerima, membaca dan menulis
socket_iovec_delete() menghapus iovec yang dialokasikan
socket_iovec_fetch() mengembalikan data sumber daya iovec yang ditentukan
socket_iovec_free() merilis sumber daya iovec
socket_iovec_set() menetapkan nilai baru dari data iovec
socket_last_error() mendapatkan kode kesalahan terakhir dari soket saat ini
socket_listen() mendengarkan semua koneksi dari soket yang ditentukan
socket_read() membaca data dengan panjang tertentu
socket_readv() membaca data dari array pencar/agregat
socket_recv() mengakhiri data dari soket ke cache
socket_recvfrom() menerima data dari soket yang ditentukan, jika tidak ditentukan, defaultnya adalah soket saat ini.
socket_recvmsg() menerima pesan dari iovec
socket_select() pilihan ganda
socket_send() Fungsi ini mengirimkan data ke soket yang terhubung
socket_sendmsg() mengirim pesan ke soket
socket_sendto() mengirimkan pesan ke soket di alamat yang ditentukan
socket_set_block() menyetel soket ke mode blok
socket_set_nonblock() Mengatur soket ke mode non-blok
socket_set_option() menyetel opsi soket
socket_shutdown() Fungsi ini memungkinkan Anda menutup pembacaan, penulisan, atau soket yang ditentukan
socket_strerror() mengembalikan kesalahan terperinci dengan nomor kesalahan yang ditentukan
socket_write() menulis data ke cache soket
socket_writev() menulis data ke array yang tersebar/agregat. Semua fungsi di atas terkait dengan soket di PHP. Untuk menggunakan fungsi ini, Anda harus membuka soket Anda. Jika Anda belum membukanya, harap edit file php.ini dan hapus Komentar berikut sebelum baris ini:
ekstensi=php_sockets.dll
Jika Anda tidak dapat menghapus komentar, gunakan kode berikut untuk memuat pustaka ekstensi:
<?php
if(!extension_loaded('soket')) {
if(strtoupper(substr(PHP_OS, 3)) == “MENANG”) {
dl('php_sockets.dll');
}kalau tidak{
dl('soket.jadi');
}
}
?>
Jika Anda tidak mengetahui apakah soket Anda terbuka, maka Anda dapat menggunakan fungsi phpinfo() untuk menentukan apakah soket tersebut terbuka. Anda dapat memeriksa apakah soket terbuka dengan memeriksa informasi phpinfo.
Lihat informasi phpinfo() tentang soket ◆ Buat server Sekarang mari kita perbaiki contoh pertama. Anda perlu mendengarkan soket tertentu dan menangani koneksi pengguna.
<?php
$commonProtocol = getprotobyname("tcp");
$soket = soket_buat(AF_INET, SOCK_STREAM, $protokol umum);
socket_bind($soket, 'localhost', 1337);
socket_listen($soket);
//Terima semua koneksi masuk ke server
$koneksi = soket_accept($soket);
jika($koneksi){
socket_write($connection, "Anda telah terhubung ke soket...nr");
}
?>
Anda harus menggunakan command prompt untuk menjalankan contoh ini. Alasannya adalah karena server akan dibuat di sini, bukan halaman Web. Jika Anda mencoba menjalankan skrip ini menggunakan browser web, kemungkinan besar skrip ini akan melebihi batas 30 detik. Anda dapat menggunakan kode di bawah ini untuk menyetel waktu proses tanpa batas, tetapi disarankan untuk menggunakan command prompt untuk menjalankannya.
set_time_limit(0);
Cukup uji skrip ini di command prompt Anda:
Contoh php.exe01_server.php
Jika Anda belum menyetel jalur ke juru bahasa php di variabel lingkungan sistem Anda, maka Anda perlu menentukan jalur ke php.exe. Saat Anda menjalankan server, Anda dapat menguji server dengan menghubungkan ke port 1337 melalui telnet.
Ada tiga masalah pada sisi server di atas: 1. Tidak dapat menerima banyak koneksi. 2. Hanya menyelesaikan satu perintah. 3. Anda tidak dapat terhubung ke server ini melalui browser web.
Masalah pertama ini lebih mudah diatasi, Anda dapat menggunakan aplikasi untuk terhubung ke server setiap saat. Namun masalah selanjutnya adalah Anda perlu menggunakan halaman Web untuk terhubung ke server, yang mana lebih sulit. Anda dapat meminta server Anda menerima koneksi, menulis beberapa data ke klien (jika harus menulisnya), menutup koneksi dan menunggu koneksi berikutnya.
Perbaiki kode sebelumnya dan buat kode berikut untuk membuat server baru Anda:
<?php
// Siapkan soket kita
$commonProtocol = getprotobyname("tcp");
$soket = soket_buat(AF_INET, SOCK_STREAM, $protokol umum);
socket_bind($socket, 'localhost', 1337); //socket_bind() mengikat soket ke alamat IP dan port
socket_listen($soket);
//Inisialisasi buffer
$buffer = "TIDAK ADA DATA";
sementara(benar) {
// Terima koneksi apa pun yang masuk pada soket ini
$connection = socket_accept($socket);//socket_accept() menerima koneksi Socket
printf("Soket tersambungrn");
// Periksa apakah ada sesuatu di buffer
jika($buffer != ""){
printf("Ada sesuatu di dalam buffer...mengirim data...rn");
socket_write($connection, $buffer . "rn"); //socket_write() menulis data ke cache soket
printf("Menulis ke soketrn");
}kalau tidak {
printf("Tidak Ada Data di Bufferrn");
}
//Dapatkan masukannya
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))//socket_read() membaca data dengan panjang yang ditentukan
{
$penyangga = $data;
socket_write($koneksi, "Informasi Diterimarn");
printf("Penyangga: " .$buffer . "rn");
}
socket_close($connection); //socket_close() menutup sumber daya soket
printf("Tutup soketrnrn");
}
?>
Apa yang harus dilakukan server ini? Ini menginisialisasi soket dan membuka cache untuk mengirim dan menerima data. Ia menunggu koneksi dan setelah koneksi dibuat, ia mencetak "Socket terhubung" pada layar di sisi server. Server ini memeriksa buffer dan jika ada data di buffer, ia mengirimkan data tersebut ke komputer yang terhubung. Kemudian mengirimkan pesan penerimaan untuk data ini. Setelah menerima pesan tersebut, ia menyimpan pesan ke data, membuat komputer yang terhubung menyadari pesan tersebut, dan akhirnya menutup koneksi. Ketika koneksi ditutup, server mulai memproses koneksi berikutnya.
◆ Sangat mudah untuk menghasilkan klien untuk menangani masalah kedua. Anda perlu membuat halaman php, menyambung ke soket, mengirim beberapa data ke cache dan memprosesnya. Kemudian Anda menunggu data yang diproses, dan Anda dapat mengirim data Anda ke server. Pada koneksi klien lain, data tersebut akan diproses.
Contoh berikut menunjukkan penggunaan soket:
<?php
// Buat soket dan sambungkan
$soket = soket_buat(AF_INET, SOCK_STREAM, SOL_TCP);
$koneksi = socket_connect($socket,'localhost', 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {
if($buffer == "TIDAK ADA DATA") {
echo(“<p>TIDAK ADA DATA</p>”);
merusak;
}kalau tidak{
// Lakukan sesuatu dengan data di buffer
echo(“<p>Data Penyangga: “ .$buffer . “</p>”);
}
}
echo(“<p>Menulis ke Socket</p>”);
// Tulis beberapa data pengujian ke soket kita
if(!socket_write($socket, “BEBERAPA DATArn”)){
echo(“<p>Penulisan gagal</p>”);
}
// Membaca respons apa pun dari soket
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){
echo(“<p>Data yang dikirim adalah: BEBERAPA DATA<br> Responnya adalah:” .$buffer . “</p>”);
}
echo(“<p>Selesai Membaca dari Socket</p>”);
?>
Kode contoh ini menunjukkan klien terhubung ke server. Klien membaca data. Jika ini adalah koneksi pertama yang tiba dalam siklus ini, server akan mengirimkan "TANPA DATA" kembali ke klien. Jika ini terjadi, klien berada di puncak koneksi. Klien mengirimkan datanya ke server, data dikirim ke server, dan klien menunggu tanggapan. Setelah respons diterima, ia menulis respons tersebut ke layar.