Aplikasi peer-to-peer menjadi mudah

Dikatakan bahwa Kazaa, aplikasi berbagi file peer-to-peer (P2P), menyebabkan lebih banyak lalu lintas jaringan daripada aplikasi lainnya. Situs Kazaa menyatakan bahwa ia telah diunduh lebih dari 385.000.000! Sebagai perbandingan, saya melihat unduhan teratas Download.com, yang mencantumkan Ad Aware sebagai unduhan paling populer, dengan hanya 117.000.000 unduhan. Dari 25 unduhan teratas Download.com, saya mengenali 11 aplikasi P2P. Hanya dari pengamatan ini saja, aplikasi P2P jelas semakin populer. Tetapi berbagi file bukan satu-satunya jenis aplikasi P2P. Sebagian besar operasi aplikasi perpesanan instan adalah P2P. Contoh lainnya adalah forum dan database terdistribusi. Dan daftarnya terus bertambah.

Untuk membuat aplikasi P2P seperti ini, Anda harus memiliki sarana untuk menemukan dan berinteraksi dengan peer lain. Sebagian besar kesulitan yang terlibat dalam pembuatan aplikasi P2P terkait dengan pemeliharaan jaringan peer, pemformatan dan penyampaian pesan, menemukan peer lain, dan masalah serupa lainnya. Project Jxta dan pengikatan Java-nya menangani aspek aplikasi Anda ini. Dengan menggunakan Jxta, Anda dapat fokus pada aplikasi Anda, bukan masalah P2P umum.

Jxta adalah versi singkat dari kata juxtapose,yang artinya berdampingan. Panduan Programmer Jxta mendefinisikan Jxta sebagai "platform komputasi terbuka yang dirancang untuk komputasi P2P." Ini tidak spesifik untuk platform apa pun atau bahasa pemrograman apa pun. Itu disusun di Sun Microsystems dan telah dirilis ke komunitas open source untuk dipelihara dan tumbuh. Bersamaan dengan rilisnya, implementasi Java awal dikeluarkan. Saya fokus pada implementasi itu di artikel ini saat saya membahas cara menggunakan Jxta di lingkungan Java. Saya juga membahas enam operasi paling umum dari aplikasi Jxta yang diimplementasikan di Java dan memperkenalkan alat yang Anda butuhkan untuk mulai menulis aplikasi P2P Anda sendiri. Setelah membaca artikel ini, saya harap Anda menyadari betapa mudah dan menyenangkannya membuat aplikasi P2P. Aplikasi P2P akan terus tumbuh tidak hanya dalam popularitas, tetapi juga dalam keragaman,dan pengembang masa depan harus mulai mempelajari teknologi ini sekarang untuk tetap menjadi yang terdepan.

Java dan Jxta

Langkah pertama untuk menggunakan Jxta adalah mengunduhnya dari halaman unduhan Jxta. Karena sebagian besar pembaca akan setuju, terkadang proyek open source sulit diperoleh dan dikonfigurasi untuk digunakan. Jxta adalah contoh proyek sumber terbuka yang bagus yang juga sangat mudah diunduh dan digunakan saat itu juga. Jika Anda mengalami kesulitan dan membutuhkan informasi lebih lanjut tentang mengunduh dan menggunakan Jxta, lihat Panduan Programmer Jxta.

Saat Anda pertama kali menjalankan aplikasi berkemampuan Jxta dari direktori baru, Anda akan diberikan GUI configurator.

Apa sebenarnya rekan itu? Menurut Daniel Brookshire (seorang pelaku Jxta yang terkenal dan disebut "juara"), ini adalah "titik komunikasi virtual", di mana rekan yang berbeda dapat berjalan pada perangkat yang sama. Perangkat tidak terbatas pada PC; bisa berupa ponsel, server, atau bahkan item yang sederhana seperti sensor. Ada rekan-rekan khusus, dua yang perlu kita waspadai adalah pertemuan dan estafet. Rendezvous peer memungkinkan peer berkomunikasi di luar cakupan subnet lokal, dan peer relai digunakan untuk menyampaikan informasi melalui firewall.

Mari kita mulai dengan membahas enam operasi aplikasi Jxta yang paling umum, sebagaimana didefinisikan dalam "Biaya Menggunakan Jxta" (IEEE Computer Society, September 2003). Mereka dicantumkan di bawah dalam urutan yang biasanya terjadi.

  1. Memulai Jxta: Memulai Jxta cukup sederhana dan cukup dengan beberapa baris kode.
  2. Bergabung dengan kelompok sebaya: Kelompok sebaya adalah sekumpulan teman yang memiliki sekumpulan minat yang sama yang telah dikelompokkan bersama. Dalam artikel ini, saya membahas bergabung dengan kelompok sebaya yang ada dan membuat yang baru.
  3. Penerbitan iklan: Iklan, secara sederhana, adalah tentang Jxta. Jxta menggunakan iklan untuk menemukan rekan, kelompok sebaya, dan sumber daya lainnya secara platform-independen. Saya membahas membaca, membuat, dan mengirim iklan baru nanti di artikel ini.
  4. Membuka pipa masukan: Pipa adalah salah satu mekanisme yang digunakan rekan untuk berkomunikasi satu sama lain. Pipa adalah " saluran komunikasi virtual " —dalam hal ini pengguna pipa tidak mengetahui alamat sebenarnya dari rekan lain. Saya membahas penggunaan pipa untuk mengirim pesan di bagian artikel ini tentang pipa.
  5. Menemukan sumber daya rekan lainnya: Sebelum Anda dapat berkomunikasi dengan rekan lain, Anda harus terlebih dahulu menemukan beberapa, yang juga akan saya bahas.
  6. Membuka pipa keluaran: Pipa keluaran digunakan untuk mengirim pesan ke peer lain. Ada dua kelas pipa keluaran: point-to-point, atau one-to-one, dan propagation, atau one-to-many.

Sekarang setelah Anda tahu ke mana artikel ini akan membawa Anda, mari kita mulai perjalanan kita.

Kelompok sebaya

Kelompok sebaya hanyalah kumpulan teman dengan beberapa minat yang sama. Grup sesama, seperti peer, dapat memberikan layanan, namun layanan peer-group tidak selalu bergantung pada peer tertentu yang memenuhi permintaan untuk itu. Selama peer tunggal dalam grup menyediakan layanan tersebut, maka layanan tersebut tersedia. Setiap rekan adalah anggota grup rekan dunia dan juga, biasanya, grup rekan bersih, dan dapat memilih untuk bergabung dan keluar dari grup lain sesuka hati. Apa motivasi pembentukan kelompok sebaya? Berikut beberapa alasannya:

  • Pertahankan wilayah aman: Jika Anda memiliki grup sesama yang aman, rekan di grup tidak perlu mengungkapkan informasi penting mereka.
  • Sediakan layanan umum: Biasanya, banyak rekan yang ingin menggunakan / memberikan layanan yang sama seperti rekan lainnya, jadi hal itu masuk akal dalam kelompok. Misalnya, Anda dapat menyediakan printer atau layanan database terdistribusi ke semua rekan dalam grup.
  • Cakupan ID batas: Nama pipa dicocokkan dengan grup tempat mereka dibuat. Jika dua pipa memiliki nama yang sama, tetapi tidak dibuat dalam grup yang sama, maka tidak ada masalah dengan menanganinya.

Mari kita periksa bagaimana kita bisa membuat dan bergabung dengan kelompok sebaya. Metode yang disediakan oleh PeerGroupantarmuka tercantum di bawah ini.

  • newGroup(Advertisement pgAdv): biasanya digunakan untuk membuat instance grup yang sudah ada dengan iklan grup yang ditemukan
  • newGroup(PeerGroupID gid, Advertisement impl, String name, String description): biasanya digunakan untuk membangun kelompok sebaya baru
  • newGroup(PeerGroupID gid): digunakan untuk membuat instance grup sesama yang ada, dan diterbitkan, hanya dengan ID grup sejenis ( gid)

Membuat kelompok sebaya

Membuat kelompok sebaya dasar relatif mudah. Mari kita lihat beberapa kode:

try { //We will create a new group based on the netPeerGroup so let's copy its //impl advertisement and modify it. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement(); myPeerGroup = netPeerGroup.newGroup( null, //Create a new group id for this group. implAdv, //Use the above advertisement. "Group name", //This is the name of the group. "Group description" //This is the description of the group. );

System.out.println("---Peer group created successfully, id: " + myPeerGroup.getPeerGroupAdvertisement().getID() ); //Now that the group is created, it is automatically published and stored locally, //but we need to publish it remotely so other peers can discover it. discoveryService.remotePublish( myPeerGroup.getPeerGroupAdvertisement() ); System.out.println("---Published peer group advertisement remotely"); } catch (Exception e) { System.out.println("An error occurred"); e.printStackTrace(); }

Panggilan untuk newGroup()membuat dan menerbitkan grup ke cache lokal. Kemungkinan besar, Anda ingin mempublikasikan iklan ini ke rekan lain saat Anda membuatnya, yang dapat Anda lakukan dengan menelepon remotePublish(). Metode ini akan mendorong iklan peer group ke peer lain. Jika Anda perlu memastikan bahwa Anda mengirim iklan ke peer di subnet lain, Anda harus memastikan Anda terhubung ke rendezvous peer. Untuk melakukan ini, gunakan kode berikut, dengan asumsi rekan pertemuan Anda sudah aktif dan dikonfigurasi dengan benar:

private void connectToRdv(PeerGroup peerGroup) { if( rdv == null) { //Get the rdv service rdv = peerGroup.getRendezVousService(); } //Make sure that we are connected before proceeding while( !rdv.isConnectedToRendezVous() ) { try { Thread.sleep(5000); } catch (InterruptedException e1) { System.out.println("rdv connect interrupted"); e1.printStackTrace(); } } } 

Bergabung dengan kelompok sebaya

Bergabung dengan kelompok sebaya bisa lebih sulit daripada benar-benar membuatnya. Bahkan jika kita memiliki grup rekan yang tidak aman, kita tetap harus membuat kredensial, kredensial kosong, dan mengirim kredensial ini ke grup peer yang coba kita ikuti.

Karena kami memiliki iklan peer group, kami perlu membuat semua kredensial yang diperlukan dan bergabung dengan grup. Sebelum kita melihat joinGroup()metodenya, mari kita lihat salah satu kelas yang digunakannya, MembershipServicekelas tersebut. Ada tiga metode dalam MembershipServicebahwa kita tertarik, khususnya apply(), join()dan resign(). Kami meneruskan ke apply()metode jenis otentikasi yang diinginkan, dan jika jenis itu didukung, itu mengembalikan kepada kami sebuah Authenticator. Kami menggunakan ini Authenticatoruntuk benar-benar bergabung dengan grup. Kami meneruskannya sebagai argumen ke join()metode, dan itu memverifikasi kredensial kami. Ketika seorang rekan ingin meninggalkan grup, panggilan untuk resign()memfasilitasi ini.

Sekarang mari kita lihat joinGroup()metodenya:

private void joinGroup() { //Assuming myPeerGroup has been instantiated //before calling this method. System.out.println("Trying to join the peer group"); try { //Create the document that will identity this peer. StructuredDocument identityInfo = null; //No identity information required for our group.

AuthenticationCredential authCred = new AuthenticationCredential( myPeerGroup, //Peer group that it is created in null, //authentication method. ); MembershipService membershipService = myPeerGroup.getMembershipService(); Authenticator auth = membershipService.apply(authCred); //See if the group is ready to be joined. //Authenticator currently makes no distinction between //failed and unfinished authentication. if( auth.isReadyForJoin() ) { Credential myCred = membershipService.join(auth); System.out.println("Joined myPeerGroup"); System.out.println("Group id: " + myPeerGroup.getPeerGroupID() ); } else { System.out.println("Unable to join the group"); } } catch (Exception e) { System.out.println("An error occurred"); e.printStackTrace(); } }

Now that we have successfully joined the group, we are able to employ provided peer group services and send messages to the members. When developing P2P applications, thinking about where you want your peer group boundaries ahead of time will assist you in the long run. Keep in mind that peer group boundaries can span many networks.

The joining process can seem daunting at first, but it is pretty straightforward once you do it a few times. Now it is possible to employ many different methods to secure a peer group—the complexity of the joining process depends on the type of authentication desired. I do not discuss these methods here.

Pipes

As explained earlier, a pipe is a virtual channel of communication between two peers. Pipes can be confusing for beginners because newbies try to relate them to what they already know—sockets. While I discuss pipes, keep in mind that they are much more abstract then sockets.

In the most basic form, there are two types of pipes; input pipes and output pipes. Applications use input pipes to receive information, and output pipes, to send information. Pipes can be used in two addressing modes:

  • Unicast (point-to-point) pipes: These pipes connect one output pipe to a single input pipe, but a single input pipe can receive messages from different output pipes
  • Propagate pipes: These pipes connect a single output pipe to many different input pipes

Pipes are an unreliable, unidirectional, and asynchronous means of communication. Beefed-up implementations of pipes are available that provide reliability, bidirectional capabilities, and secure transit.

To create a pipe, first you must create a pipe advertisement and publish it. Then you need to get the pipe service from the peer group and use it to create the pipe. Each pipe has a pipe ID associated with it, which is used to address the pipe.

To create a new pipe ID, we use the IDFactory in the net.jxta.id package. Here is a sample of how to create and print the ID:

 ID id = IDFactory.newPipeID( peerGroup.getPeerGroupID() ); System.out.println( id.toURI() ); 

Note:peerGroup is the peer group for which you want to create the pipe.

Jadi dua rekan dapat berkomunikasi satu sama lain, mereka harus mengetahui ID pipa untuk pipa yang ingin mereka komunikasikan. Ada beberapa cara untuk memastikan bahwa mereka berdua mengetahui informasi ini:

  • Kedua rekan membaca iklan pipa yang sama dari sebuah file
  • ID pipa di-hardcode ke dalam aplikasi
  • Publikasikan dan temukan ID pipa pada waktu proses
  • ID pipa dihasilkan dari ID terkenal