Powtórzenie wybranych zagadnień 1. Aplikacja typu Klient-Serwer
1.1.Start serwera
1.2. Start klienta
1.3. Reakcja serwera
import java.io.*;
import java.util.*;
public class Wiadomosc implements Serializable { String dane;
Date data;
public void zapiszWiadomosc() { data = new Date();
dane ="Wyslij";}
public void odczytajWiadomosc() { System.out.println(data);
System.out.println(dane); } }
import java.net.*; //ten program należy uruchomić jako pierwszy import java.io.*;
public class serwer2 implements Runnable { private int sPort;
private ServerSocket serwer;
private Socket gniazdo_klienta;
private ObjectOutputStream wyjscie;
private ObjectInputStream wejscie;
private String host;
private Wiadomosc wiadomosc;
public serwer2(int port_, String host_) { sPort = port_; host=host_;
try
{ serwer = new ServerSocket(sPort);
} catch(IOException e) { System.out.println(e); } }
public void run()
{ System.out.println("Serwer startuje na hoscie "+host);
{ try { try
{ gniazdo_klienta = serwer.accept();
} catch (IOException e)
{ System.out.println("Nie mozna polaczyc sie z klientem "+e);
System.exit(1);}
wyjscie = new ObjectOutputStream(gniazdo_klienta.getOutputStream());
wyjscie.flush();
wejscie = new ObjectInputStream(gniazdo_klienta.getInputStream());
wiadomosc = (Wiadomosc) wejscie.readObject();
System.out.println("Jaka wiadomosc odebral serwer od klienta:");
wiadomosc.odczytajWiadomosc();
wejscie.close();
wyjscie.close();
gniazdo_klienta.close();
} catch (Exception e)
{ System.out.println("Wyjatek serwera "+e); } }}
public static void main(String args[]) throws Exception { String host_ = InetAddress.getLocalHost().getHostName();
int Port = 5000;
import java.net.*; //ten program należy uruchomić jako drugi import java.io.*;
public class klient2 implements Runnable { private int port;
private Socket gniazdo_klienta;
private ObjectOutputStream wyjscie;
private ObjectInputStream wejscie;
private String host;
private Wiadomosc wiadomosc;
klient2(String host_, int port_) { host = host_;
port = port_;}
public void run() {
try
{gniazdo_klienta = new Socket (host,port);
wejscie = new ObjectInputStream(gniazdo_klienta.getInputStream());
wyjscie = new ObjectOutputStream(gniazdo_klienta.getOutputStream());
wyjscie.flush();
System.out.println("Klient startuje na hoscie "+
InetAddress.getLocalHost().getHostName());
wiadomosc = new Wiadomosc();
wiadomosc.zapiszWiadomosc();
System.out.println("Co wysyla klient: ");
wiadomosc.odczytajWiadomosc();
wyjscie.writeObject(wiadomosc);
gniazdo_klienta.close();
wyjscie.close();
wejscie.close();
} catch (Exception e)
{ System.out.println("Wyjatek klienta "+e); } }
public static void main(String args[]) throws Exception
{ //String s = InetAddress.getLocalHost().getHostName();
String s = InetAddress.getByName("kloc").getHostName();
klient2 k2= new klient2(s,5000);
Thread t = new Thread(k2);
t.start();
} }
2. RMI
2.1. Definicja interfejsu obiektu zdalnego oraz klasę obiektu zdalnego implementującą ten interfejs
1) interfejs RMI_Obiekt_zdalny import java.rmi.*;
import java.util.*;
public interface RMI_Obiekt_zdalny extends Remote { public void pobierzWiadomosc(String s, Wiadomosc w)
throws RemoteException;
public Wiadomosc zmienWiadomosc(String s, Wiadomosc w)
throws RemoteException;
}
2)
klasa implementująca interfejs obiektu zdalnego -
RMI_Obiekt import java.io.*;import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
public class RMI_Obiekt extends UnicastRemoteObject implements RMI_Obiekt_zdalny {
public RMI_Obiekt() throws RemoteException { super(); }
public void pobierzWiadomosc(String s, Wiadomosc w) throws RemoteException { System.out.println(s);
w.odczytajWiadomosc(); }
public Wiadomosc zmienWiadomosc(String s, Wiadomosc w)
throws RemoteException { System.out.println(s);
w.odczytajWiadomosc();
Wiadomosc w1= new Wiadomosc();
w1.dane="Nowa Wiadomosc";
w1.data=new Date();
return w1; }
3) wykonanie architektury trójwarstwowej RMI – pliki RMI_Obiekt_Skel.class oraz RMI_Obiekt_Stub.class za pomocą kompilatora rmic
2.2.) wykonaie serwera RMI z obiektem zdalnym – ten program należy uruchomoc jako pierwszy
import java.rmi.*;
import java.rmi.server.*;
public class RMI_Server {
public static void main(String[] args)
{ System.setSecurityManager(new RMISecurityManager());
try
{ RMI_Obiekt_zdalny wiadomosc = new RMI_Obiekt();
Naming.rebind("RMI_Obiekt", wiadomosc);
System.out.println("Serwer przygotowany do RMI");
}
catch (Exception e)
{System.out.println("Blad "+e);
} } }
2.3. Wykonanie klienta RMI – ten program należy uruchomić jako drugi import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.io.*;
import java.util.*;
public class RMI_Klient { RMI_Obiekt_zdalny obiekt;
Wiadomosc wiadomosc1, wiadomosc2;
public static void main(String []args) { RMI_Klient klient = new RMI_Klient();
System.setSecurityManager(new RMISecurityManager());
try
{ klient.obiekt= (RMI_Obiekt_zdalny) Naming.lookup("RMI_Obiekt");
System.out.println("Klient przygotowany do RMI");
klient.wiadomosc1 = new Wiadomosc();
klient.wiadomosc1.zapiszWiadomosc();
klient.obiekt.pobierzWiadomosc (
"\nKlient uzywa metody pobierzWiadomosc obiektu z serwera za pomoca RMI", klient.wiadomosc1);
klient.wiadomosc2 = klient.obiekt.zmienWiadomosc(
"\nKlient uzywa metody zmienWiadomosc obiektu z serwera za pomoca RMI", klient.wiadomosc1);
System.out.println(
"Klient wyswietla zawartosc odebranego od serwera obiektu typu Wiadomosc");
klient.wiadomosc2.odczytajWiadomosc();
}
catch (Exception e)
{ System.out.println(e.getMessage());}
} }