1. Analisis pembukaan
Mulai hari ini, mari kita pelajari secara rinci dalam modul tertentu. Artikel ini adalah artikel ketiga dalam seri ini. Dua artikel pertama terutama didasarkan pada teori. Saya percaya bahwa dalam studi dua artikel pertama,
Saya juga memiliki pemahaman dasar tentang nodeJs, tidak apa -apa! Lai Lai Serang saat setrika panas, mari kita terus membawa nodeJs ke ujungnya. Nah, tanpa mengatakan banyak omong kosong, langsung ke topik "Modul Net" hari ini. Jadi bagaimana seharusnya "bersih" memahami itu?
Untuk apa itu? (Modul Net dapat digunakan untuk membuat server soket atau klien soket. Dua modul paling dasar untuk komunikasi data nodeJS adalah bersih dan http. Yang pertama adalah enkapsulasi berbasis TCP, sedangkan yang terakhir pada dasarnya adalah lapisan TCP, tetapi telah melakukan banyak enkapsulasi data, yang kami anggap sebagai lapisan presentasi).
Di sini kami merujuk pada kode sumber di nodeJS "http.js":
Tidak sulit untuk melihat dari gambar bahwa Httpserver mewarisi kelas bersih, memiliki kemampuan komunikasi terkait, dan telah melakukan lebih banyak enkapsulasi data, yang kami anggap sebagai lapisan representasi yang lebih canggih.
Pengetahuan yang diperluas (berikut ini adalah kode sumber "warisan"):
Salinan kode adalah sebagai berikut:
Exports.inherit = function (ctor, superctor) {
ctor.super_ = superctor;
ctor.prototype = object.create (superctor.prototype, {
Konstruktor: {
Nilai: Ctor,
Hancur: Salah,
Tulisan: Benar,
dapat dikonfigurasi: Benar
}
});
};
Fungsinya adalah untuk menyadari warisan dan penggunaan kembali.
Saya baru saja memberikan gambaran singkat, yang berisi beberapa konsep yang umum digunakan. Berikut adalah pengantar singkat untuk mempopulerkan konsep:
(1) TCP/IP ---------- TPC/IP Protocol adalah protokol lapisan transport, yang terutama memecahkan bagaimana data ditransmisikan pada jaringan.
(2), Socket ----- Socket adalah enkapsulasi dan aplikasi protokol TCP/IP (level program).
(3), http ------ HTTP adalah protokol lapisan-lapisan, yang terutama memecahkan cara membungkus data.
(4) Model jaringan tujuh lapis --------------------------------------------------------------------------------------------------------------------------
Singkatnya: Socket adalah enkapsulasi protokol TCP/IP. Soket itu sendiri bukan protokol, tetapi antarmuka panggilan (API).
Ini membentuk beberapa antarmuka fungsional paling dasar yang kita ketahui, seperti membuat, mendengarkan, menghubungkan, menerima, mengirim, membaca dan menulis, dll.
TCP/IP hanyalah tumpukan protokol, seperti mekanisme operasi sistem operasi, itu harus diimplementasikan secara rinci, dan juga menyediakan antarmuka operasi eksternal.
Faktanya, TCP lapisan transport didasarkan pada protokol IP dari lapisan jaringan, dan protokol HTTP dari lapisan aplikasi didasarkan pada protokol TCP dari lapisan transportasi. Soket itu sendiri bukan protokol. Seperti disebutkan di atas, ini hanya menyediakan antarmuka untuk pemrograman TCP atau UDP.
Kedua, alami
Oke, kita memiliki konsepnya, mari kita ambil contoh:
1. Buat server.js
Salinan kode adalah sebagai berikut:
var net = membutuhkan ('net');
var server = net.createServer (function (c) {// connection listener
Console.log ("Server Connected");
c.on ("end", function () {
Console.log ("Server telah terputus");
});
C.Write ("Halo, Bigbear!/R/N");
C.Pipe (C);
});
server.listen (8124, function () {// pendengar mendengarkan
console.log ("server terikat");
});
2. Buat klien.js
Salinan kode adalah sebagai berikut:
var net = membutuhkan ('net');
var client = net.connect ({
Port: 8124
}, function () {// Connect listener
console.log ("Client Connected");
client.write ('halo, sayang!/r/n');
});
client.on ("data", fungsi (data) {
console.log (data.tostring ());
client.end ();
});
client.on ("end", function () {
console.log ("Client Disconnect");
});
Mari kita analisis:
Server ------ net.createServer membuat layanan TCP. Layanan ini terikat (server.listen) di port 8124. Setelah membuat server, kami melihat fungsi callback.
Saat memanggil fungsi di atas, parameter juga merupakan fungsi, dan menerima soket, pipa yang dibangun dengan metode lain, dan fungsinya adalah untuk interaksi data.
Pipa perlu disambut oleh klien untuk membuatnya. Jika tidak ada akses klien ke server saat ini, soket ini tidak akan ada.
Seperti namanya,客户端------net.connect terhubung ke server. Parameter pertama adalah objek. Port (port) diatur ke 8124, yang merupakan port yang didengarkan server kami. Karena parameter host tidak diatur, standarnya adalah LocalHost (lokal).
Di server, soket adalah salah satu ujung pipa, dan di klien, klien itu sendiri adalah salah satu ujung pipa. Jika beberapa klien terhubung ke server, server akan membuat beberapa soket, dan setiap soket sesuai dengan klien.
Hasil Menjalankan:
3. PENDAHULUAN KASUS
(1) Kode berikut hanyalah server yang menghasilkan sepotong teks ke klien untuk menyelesaikan komunikasi satu arah dari server ke klien.
Salinan kode adalah sebagai berikut:
// Sever-> komunikasi satu arah klien
var net = membutuhkan ('net');
var chatserver = net.createServer ();
chatserver.on ('connection', function (klien) {
client.write ('hai!/n'); // Server mengeluarkan informasi ke klien dan menggunakan metode write ()
client.write ('bye!/n');
client.end (); // Server mengakhiri sesi
});
ChatServer.Listen (9000);
Tes Telnet: Telnet127.0.0.1: 9000
Setelah mengeksekusi Telnet, sambungkan ke titik layanan, umpan balik karakter HI! Bye!, Dan segera akhiri program server dan hentikan koneksi.
Bagaimana jika kita ingin server terhubung ke informasi ke klien?
Anda dapat mendengarkan acara server.data dan tidak membatalkan koneksi (atau akan segera mengakhiri pesan dari klien yang tidak dapat diterima).
(2), dengarkan acara server.data dan jangan membatalkan koneksi (jika tidak, pesan dari klien tidak akan dapat diterima segera).
Salinan kode adalah sebagai berikut:
// Berdasarkan yang pertama, mengimplementasikan klien-> komunikasi yang terputus, yang merupakan komunikasi dua arah
var net = membutuhkan ('net');
var chatserver = net.createServer (),
ClientList = [];
chatserver.on ('connection', function (klien) {
// JS dapat dengan bebas menambahkan properti ke objek. Di sini kami menambahkan atribut nama khusus untuk menunjukkan klien mana (alamat + port klien berdasarkan)
client.name = client.remoteAddress + ':' + client.remoteport;
client.write ('hai' + client.name + '!/n');
clientlist.push (klien);
client.on ('data', function (data) {
siaran (data, klien); // Terima informasi dari klien
});
});
Fungsi siaran (pesan, klien) {
untuk (var i = 0; i <clientlist.length; i+= 1) {
if (klien! == clientlist [i]) {
ClientList [i] .write (client.name + "mengatakan" + pesan);
}
}
}
ChatServer.Listen (9000);
Apakah di atas kode lengkap? Kami mengatakan ada masalah lain yang belum dipertimbangkan: yaitu, begitu klien keluar, tetap ada di daftar klien, yang jelas merupakan penunjuk nol.
(3) Memproses daftar klien
Salinan kode adalah sebagai berikut:
chatserver.on ('connection', function (klien) {
client.name = client.remoteaddress + ':' + client.remoteport
client.write ('hai' + client.name + '!/n');
clientlist.push (klien)
client.on ('data', function (data) {
siaran (data, klien)
})
client.on ('end', function () {
clientlist.splice (clientlist.indexof (klien), 1); // Hapus elemen formula dalam array.
})
})
NodetCPAPI telah memberi kami acara akhir, yaitu, ketika klien membatalkan koneksi ke server.
(4) Mengoptimalkan siaran
Salinan kode adalah sebagai berikut:
Fungsi siaran (pesan, klien) {
var cleanup = []
untuk (var i = 0; i <clientlist.length; i+= 1) {
if (klien! == clientlist [i]) {
if (clientlist [i] .writable) {// Periksa apakah soket dapat ditulis terlebih dahulu
ClientList [i] .write (client.name + "mengatakan" + pesan)
} kalau tidak {
cleanup.push (daftar klien [i]) // Jika tidak dapat ditulis, kumpulkan dan hancurkan. Sebelum kehancuran, socket.destroy () harus dihancurkan oleh API.
ClientList [i] .destroy ()
}
}
} // Hapus node mati dari loop tulis untuk menghindari indeks loop membuang
untuk (i = 0; i <cleanup.length; i+= 1) {
clientlist.splice (clientlist.indexof (cleanup [i]), 1)
}
}
Perhatikan bahwa sekali "akhir" tidak dipicu, pengecualian akan terjadi, sehingga pekerjaan optimisasi akan dilakukan.
(5) NetAPI juga menyediakan acara kesalahan untuk menangkap pengecualian klien
Salinan kode adalah sebagai berikut:
client.on ('error', function (e) {
console.log (e);
});
Empat, mari kita ringkas
1. Memahami konsep yang relevan dari awal
2. Memahami hubungan antara http dan modul bersih
3. Berdasarkan contoh dalam artikel ini, silakan merujuk ke API yang relevan untuk dipraktikkan.
4. Ide komunikasi antara klien soket dan server
5. Jika Anda tertarik, Anda dapat meningkatkan contoh ruang obrolan itu