Aplikasi peer-to-peer dipermudah

Telah dikatakan bahawa Kazaa, aplikasi perkongsian fail peer-to-peer (P2P), menyebabkan lebih banyak lalu lintas rangkaian daripada aplikasi lain. Laman Web Kazaa menyatakan bahawa ia mempunyai lebih daripada 385,000,000 muat turun! Sebagai perbandingan, saya melihat muat turun teratas Download.com, yang menyenaraikan Ad Aware sebagai muat turun paling popular, dengan hanya 117,000,000 muat turun. Dari 25 muat turun teratas Download.com, saya mengenali 11 aplikasi P2P. Hanya dari pemerhatian ini sahaja, aplikasi P2P jelas semakin popular. Tetapi perkongsian fail bukan satu-satunya jenis aplikasi P2P. Sebilangan besar operasi aplikasi pesanan ringkas adalah P2P. Contoh lain adalah forum dan pangkalan data yang diedarkan. Dan senarai itu terus berkembang.

Untuk membuat aplikasi P2P seperti ini, anda mesti mempunyai kaedah untuk menemui dan berinteraksi dengan rakan sebaya yang lain. Sebilangan besar kesukaran yang terlibat dalam membuat aplikasi P2P adalah berkaitan dengan menjaga jaringan rakan sebaya, memformat dan menyampaikan pesan, menemui rakan sebaya lain, dan masalah serupa lainnya. Project Jxta dan pengikatan Java-nya menangani aspek aplikasi ini. Dengan menggunakan Jxta, anda boleh memfokuskan pada aplikasi anda, bukan masalah P2P generik.

Jxta adalah versi pendek dari kata juxtapose,yang bermaksud berdampingan. Panduan Pengatur Jxta mendefinisikan Jxta sebagai "platform pengkomputeran terbuka yang direka untuk pengkomputeran P2P." Ini khusus untuk platform atau bahasa pengaturcaraan mana pun. Ini dikandung di Sun Microsystems dan telah diluncurkan kepada komuniti sumber terbuka untuk memelihara dan berkembang. Seiring dengan peluncurannya, implementasi Java awal dikeluarkan. Saya fokus pada pelaksanaan itu dalam artikel ini ketika saya membincangkan cara menggunakan Jxta dalam lingkungan Java. Saya juga merangkumi enam operasi aplikasi Jxta yang paling biasa dilaksanakan di Java dan memperkenalkan alat yang anda perlukan untuk mula menulis aplikasi P2P anda sendiri. Setelah membaca artikel ini, saya harap anda akan menyedari betapa senang dan senangnya membuat aplikasi P2P. Aplikasi P2P akan terus berkembang bukan sahaja dalam populariti, tetapi juga kepelbagaian,dan pembangun esok mesti mula mempelajari teknologi ini hari ini untuk terus maju.

Java dan Jxta

Langkah pertama untuk menggunakan Jxta ialah memuat turunnya dari halaman muat turun Jxta. Seperti yang dipersetujui oleh kebanyakan pembaca, kadang-kadang projek sumber terbuka sukar diperoleh dan dikonfigurasikan untuk digunakan. Jxta adalah contoh projek sumber terbuka yang hebat yang juga sangat mudah dimuat turun dan digunakan dengan segera. Sekiranya anda menghadapi masa yang sukar dan memerlukan lebih banyak maklumat mengenai memuat turun dan menggunakan Jxta, rujuk Panduan Pengaturcara Jxta.

Semasa pertama kali menjalankan aplikasi berkemampuan Jxta dari direktori baru, anda akan diberikan konfigurasi GUI.

Apa sebenarnya rakan sebaya? Menurut Daniel Brookshire (pelaku Jxta yang terkenal dan disebut "juara"), ia adalah "titik komunikasi maya," di mana rakan sebaya yang berlainan dapat berjalan pada perangkat yang sama. Peranti tidak terhad kepada PC; ia boleh menjadi telefon bimbit, pelayan, atau bahkan item yang semudah sensor. Ada rakan sebaya, dua yang perlu kita perhatikan adalah pertemuan dan penyampai. Rakan sebaya membolehkan rakan sebaya berkomunikasi di luar ruang lingkup subnet tempatan, dan rakan sebaya digunakan untuk menyampaikan maklumat melalui firewall.

Mari kita mulakan dengan membahas enam operasi aplikasi Jxta yang paling biasa, seperti yang dinyatakan dalam "Kos Penggunaan Jxta" (IEEE Computer Society, September 2003). Mereka disenaraikan di bawah mengikut urutan biasanya.

  1. Memulakan Jxta: Memulakan Jxta cukup mudah dan hanya beberapa baris kod.
  2. Bergabung dengan kumpulan rakan sebaya: Kumpulan rakan sebaya adalah sekumpulan rakan sebaya yang mempunyai sekumpulan minat yang sama yang telah dikumpulkan bersama. Dalam artikel ini, saya meliputi bergabung dengan kumpulan rakan sebaya yang ada dan membuat yang baru.
  3. Menerbitkan iklan: Iklan, dinyatakan secara sederhana, adalah maksud Jxta. Jxta menggunakan iklan untuk mencari rakan sebaya, kumpulan rakan sebaya, dan sumber lain dengan cara yang tidak bergantung pada platform. Saya membincangkan membaca, membuat, dan menghantar iklan baru dalam artikel ini.
  4. Membuka paip input: Paip adalah salah satu mekanisme yang digunakan rakan sebaya untuk berkomunikasi antara satu sama lain. Paip adalah " saluran komunikasi maya " —seringkali di mana pengguna paip tidak mengetahui alamat sebenar rakan sebaya yang lain. Saya membincangkan penggunaan paip untuk menghantar mesej di bahagian artikel ini mengenai paip.
  5. Mencari sumber rakan sebaya yang lain: Sebelum anda dapat berkomunikasi dengan rakan sebaya yang lain, anda mesti menemui sebilangannya, yang juga akan saya bincangkan.
  6. Membuka paip output: Paip output digunakan untuk menghantar mesej kepada rakan sebaya yang lain. Terdapat dua kelas paip output: titik-ke-titik, atau satu-ke-satu, dan penyebaran, atau satu-ke-banyak.

Setelah anda mengetahui di mana artikel ini akan membawa anda, mari mulakan perjalanan kami.

Rakan sebaya

Kumpulan rakan sebaya hanyalah kumpulan rakan sebaya dengan beberapa kumpulan minat bersama. Kumpulan rakan sebaya, seperti rakan sebaya, dapat memberikan perkhidmatan, namun perkhidmatan kelompok sebaya tidak semestinya bergantung pada rakan sebaya tertentu yang memenuhi permintaan kepadanya. Selagi seorang rakan sebaya dalam kumpulan menyediakan perkhidmatan, maka perkhidmatan itu tersedia. Setiap rakan sebaya adalah anggota kumpulan rakan sebaya dunia dan juga, biasanya, kumpulan rakan sebaya, dan dapat memilih untuk bergabung dan meninggalkan kumpulan lain sesuka hati. Apakah motivasi untuk mewujudkan kumpulan rakan sebaya? Berikut adalah beberapa sebab:

  • Kekalkan wilayah aman: Sekiranya anda mempunyai kumpulan rakan sebaya yang aman, rakan sebaya tidak perlu mendedahkan maklumat kritikal mereka.
  • Berikan perkhidmatan biasa: Biasanya, sebilangan besar rakan sebaya ingin menggunakan / memberikan perkhidmatan yang sama dengan rakan sebaya yang lain, jadi melakukannya dalam kumpulan hanya masuk akal. Sebagai contoh, anda boleh menyediakan pencetak atau perkhidmatan pangkalan data yang diedarkan kepada semua rakan sebaya dalam kumpulan.
  • Had skop ID: Nama paip dipadankan dengan kumpulan tempat mereka dibuat. Sekiranya dua paip mempunyai nama yang sama, tetapi tidak dibuat dalam kumpulan yang sama, maka tidak ada masalah dengan mengatasinya.

Mari kita kaji bagaimana kita dapat membuat dan menyertai kumpulan rakan sebaya. Kaedah yang disediakan oleh PeerGroupantara muka disenaraikan di bawah.

  • newGroup(Advertisement pgAdv): biasanya digunakan untuk memberi contoh kumpulan yang sudah ada dengan iklan kumpulan yang ditemui
  • newGroup(PeerGroupID gid, Advertisement impl, String name, String description): biasanya digunakan untuk membina kumpulan rakan sebaya baru
  • newGroup(PeerGroupID gid): digunakan untuk menunjukkan kumpulan rakan sebaya yang ada, dan diterbitkan, dengan hanya ID kumpulan rakan sebaya ( gid)

Membuat kumpulan rakan sebaya

Membuat kumpulan rakan sebaya asasnya agak mudah. Mari lihat beberapa kod:

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 kumpulan ke cache tempatan. Kemungkinan besar, anda ingin menerbitkan iklan ini kepada rakan sebaya lain semasa anda membuatnya, yang boleh anda lakukan dengan menghubungi remotePublish(). Kaedah ini akan mendorong iklan kumpulan rakan sebaya kepada rakan sebaya yang lain. Sekiranya anda perlu memastikan bahawa anda mengirim iklan kepada rakan sebaya di subnet lain, anda mesti memastikan anda terhubung dengan rakan sebaya. Untuk melakukan ini, gunakan kod berikut, dengan anggapan rakan sebaya anda sudah siap dan dikonfigurasi dengan betul:

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(); } } } 

Menyertai kumpulan rakan sebaya

Bergabung dengan rakan sebaya boleh menjadi lebih sukar daripada membuat satu. Walaupun kita mempunyai kumpulan rakan sebaya yang tidak terjamin, kita masih mesti membuat tauliah, kelayakan kosong, dan mengirim kelayakan ini ke kumpulan rakan sebaya yang kita coba sertai.

Since we have a peer group advertisement, we need to create all the credentials necessary and join the group. Before we look at the joinGroup() method, let's look at one of the classes it uses, the MembershipService class. There are three methods in MembershipService that we are interested in, specifically apply(), join(), and resign(). We pass to the apply() method the type of authentication desired, and if that type is supported, it returns to us an Authenticator. We use this Authenticator to actually join the group. We pass it as an argument to the join() method, and it verifies our credentials. When a peer wants to leave a group, the call to resign() facilitates this.

Now let's look at the joinGroup() method:

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.

Oleh itu, dua rakan sebaya dapat berkomunikasi antara satu sama lain, mereka mesti mengetahui ID paip untuk paip yang ingin mereka berkomunikasi. Terdapat beberapa cara untuk memastikan bahawa mereka berdua mengetahui maklumat ini:

  • Kedua rakan sebaya membaca iklan paip yang sama dari fail
  • ID paip dikodkan keras ke dalam aplikasi
  • Terbitkan dan temukan ID paip pada waktu runtime
  • ID paip dihasilkan dari ID yang terkenal