|
9-15-laboratoriya ishi
|
bet | 4/7 | Sana | 23.05.2024 | Hajmi | 2,73 Mb. | | #251584 |
12-LABORATORIYA ISHI
Mavzu: Taqsimlangan kliyent-server ilovalar yaratish
Ishning maqsadi:
Talabalarda Java dasturlash tilining java.rmi.* paketi klasslaridan foydalanib taqsimlangan kliyent-server ilovalar yaratish bo‘yicha ko‘nikmalar hosil qilish.
Nazariy qism:
RMI - Remote Method Invocation haqida. Remote Method Invocation (RMI) Javada taqsimlangan ilovani yaratishni ta’minlaydigan ilovaning dasturiy interfeysi (API) hisoblanadi. RMI boshqa Javadagi virtual mashinalarda (JVM) boshqariladigan obyekt metodlarini chaqirishga obyektlarga ruxsat beradi. RMI ikkita obyektlar ya’ni stub va skeletondan foydalanib, ilovalar oʻrtasida masofadan turib aloqa qilishni ta’minlab beradi. RMI masofadagi obyektlar bilan aloqani amalga oshirish uchun stub va skeleton obyektlaridan foydalanadi. Masofadagi obyektlar boshqa Javadagi virtual mashinalardan metodlarni chaqirib oluvchi obyektdir. Stub kliyent tomonidan shlyuz sifatida oʻzini tutadigan obyektdir. Barcha chiquvchi soʻrovlar u orqali yoʻnaltiriladi. U kliyent tomonida joylashadi va masofadagi obyektlarda qatnashadi. Chaqiruvchi stub obyektdan metodni chaqirganda, u quyidagi vazifalarni bajaradi:
1 U masofadagi virtual mashina bilan aloqani boshlaydi.
2 U masofadagi virtual mashinaga parametrlarni yozadi va uzatadi.
3 U qayta qiymatlarni oʻqiydi.
Va oxirida qiymatni chaqiruvchiga qaytaradi. Skeleton server tomon uchun oʻzini shlyuzdek tutuvchi obyektdir. Barcha kiruvchi soʻrovlar u orqali yoʻnaltiriladi. Skeleton kiruvchi soʻrovni qabul qilganida, u quyidagi vazifalarni bajaradi:
1 U masofadagi metodlar uchun parametrlarni oʻqiydi.
2 U haqiqiy masofadagi obyektlar metodini chaqirib oladi va chaqiruvchiga natijani uzatadi va yozadi.
RMI ilovada kliyent ham server masofadagi interfeys bilan ta’sir koʻrsatadi. Kliyent ilovasi proksi obyekti metodini chaqiradi, RMI javadagi virtual mashinalarga soʻrovlar joʻnatadi. Qaytuvchi qiymat proksi obyektga keyin kliyent ilovasiga qayta joʻnatiladi.
Java masofaviy usul chaqiruvi orqali bir nechta kompyuterlarda boshqaruv vaqtidagi moslamalarni tarqatishni qoʻllab-quvvatlaydi. Ushbu taqsimlangan obyektlar toʻplami Java dasturlarining bir nechta mashinalardagi aloqasini osonlashtiradi. Fikr shundan iboratki, mijoz oddiy yuqori darajadagi soʻrov yordamida serverdan obyektni soʻraydi. Quyida biz RMI dasturini yaratish uchun zarur boʻlgan qadamlarni umumlashtiramiz. Keyin toʻrtta RMI misolini keltiramiz:
1. Masofadagi obyektdan xabarlar qatorini qaytaradigan oddiy RMI misoli.
2. Masofadagi obyekt orqali raqamli integratsiyani amalga oshiradigan aniq misol.
3. RMI dasturi masofadagi obyektlarni bog’laydi.
RMI ilovasini qurish bosqichlari. RMIdan foydalanish uchun biz ikkita narsani qilishimiz zarur: toʻrtta sinflar qurish va besh bosqichni bajarish. Sinflarni va bosqichlarni qisqacha tushuntirib oʻtamiz.
RMI dan foydalanganda toʻrtta asosiy sinfni qurishimiz kerak:
1. Masofadagi obyekt uchun interfeys. Bu interfeys kliyent hamda server tomonidan foydalaniladi.
2. RMI kliyent – kliyent masofadagi serverdan obyektni qidiradi, keyin obyektdan mahalliy obyektdek foydalanadi.
3. Obyektni amalga oshirish – obyektni interfeysning birinchi bosqichida amalga oshirish kerak va u server tomonidan foydalaniladi.
4. RMI server – bu sinf obyekt uchun misol yaratadi va obyektni roʻyhatdan oʻtqazadi.
Tizimni kompilatsiya qilish va ishga tushirish.
1. Kliyent va serverni kompilatsiya qilish – bu bosqich masofadagi obyekt interfeysini kompilyatsiya qiladi.
2. Kliyent stub va server skeletonini yaratish – kliyent stub va server skeleton chaqiriqlar metodini qoʻllab-quvvatlaydi va qurilmalarni mustaqil kodlanishini ta’minlaydi. Kliyent tizmiga kliyent sinfi, sinf interfeysi va kliyent
stub sinfi kerak. Server tizimiga server sinfi, masofadagi obyekt interfeysi va server skeleton sinfi kerak.
3. RMIni roʻyhatga olishni boshlash - roʻyhatga olish bir marotaba amalga oshiriladi va har bir masofadagi obyekt uchun emas.
4. Serverni ishga tushirish – bu bosqich bir xil qurilmalarda amalga oshiriladi.
5. Kliyentni ishga tushirish – bu bosqich mustaqil qurilmalarda amalga oshiriladi.
RMI ilovalar uchun umumiy ma’lumot.
Ikkita alohida dastur RMI ilovalari tarkibiga kiradi: server va client. Odatda server ilovasi ba’zi masofaviy obyektlarni yaratadi, ularga mos yozuvlar beradi va mijozlar ushbu masofaviy obyektlardagi usullarni chaqirishini kutadi. Odatiy kliyent ilovasi serverdagi bir yoki bir nechta masofaviy qurilmalarga beradi va keyin ularni usullarini chaqiradi. RMI server va mijozning axborotni oldinga va orqaga oʻtkazishni ta’minlaydi. Bunday dastur ba’zan taqsimlangan obyektlar ilovasi deb ataladi.
Server kodi:
package rmi;
import java.io.Serializable;
public class Card implements Serializable
{
private static final long serialVersionUID = 1L;
private String name ;
private String number;
private double money ;
public Card(String name, String number, double money)
{
super();
this.name = name;
this.number = number;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public boolean equals(Object card)
{
return this.getNumber().equalsIgnoreCase(((Card)card).getNumber());
}
Client kodi:
package rmi;
import java.net.MalformedURLException;
import java.rmi.*;
public class BillingClient
{
private String localhost = "127.0.0.1";
private String RMI_HOSTNAME = "java.rmi.server.hostname";
private String SERVICE_PATH = "rmi://localhost/BillingService";
private String[][] CARDS = {{"Salimov", "8600-0456-7890-5265"},
{"Djurayev", "8600-6554-3210-5542"}};
private double[] MONEYS = {135790.0, 24680.0};
private Card createCard (final int idx)
{
return new Card(CARDS[idx][0], CARDS[idx][1], 0);
}
private void registerCards(BillingService bs)
{
for (int i = 0; i < CARDS.length; i++) {
Card card = createCard (i);
try {
bs.addNewCard(card);
} catch (RemoteException e) {
System.err.println("RemoteException : " + e.getMessage());
}
}
}
private void addMoney(BillingService bs)
{
for (int i = 0; i < CARDS.length; i++) {
Card card = createCard (i);
try { bs.addMoney(card, MONEYS[i]);
} catch (RemoteException e) {
System.err.println("RemoteException : " + e.getMessage());
}
}
}
private void getBalance(BillingService bs)
{
for (int i = 0; i < CARDS.length; i++) {
Card card = createCard (i);
try {
System.out.println("card : " + card.getNumber() +
", balance = " + bs.getCardBalance(card));
} catch (RemoteException e) {
System.err.println("RemoteException : " + e.getMessage());
}
}
}
public BillingClient()
{
try {
System.setProperty(RMI_HOSTNAME, localhost);
String objectName = SERVICE_PATH;
BillingService bs = (BillingService) Naming.lookup(objectName);
System.out.println("\nRegister cards ...");
registerCards(bs);
System.out.println("Add moneys ...");
addMoney(bs);
System.out.println("Get balance ...\n");
getBalance(bs);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
System.err.println("NotBoundException : " + e.getMessage());
}
} public static void main(String[] args)
{
new BillingClient();
System.exit(0);
}
}
|
| |