📄 serwer_rmi.java
字号:
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.util.*;
public class Serwer_RMI extends UnicastRemoteObject implements SerwerInterface, Runnable {
public static int sekcja_krytyczna= 0;
private Vector<Object> klienci = new Vector<Object>();
private final String nazwaSerwera = "Serwer_RMI";
private Registry rejestr;
private final String komunikatZezwolenia = new String("SERWER : Pozwolenie na wejscie do sekcji krytycznej");
private final String komunikatZakazu = new String("SERWER : Zakaz wejscia do sekcji krytycznej");
public Serwer_RMI() throws RemoteException
{
System.out.println("SERWER : Utworzono obiekt serwera");
try
{
//rejestr = LocateRegistry.getRegistry(Registry.REGISTRY_PORT);
rejestr = LocateRegistry.createRegistry(1099);
System.out.println("SERWER : Zlokalizowano rejestr na porcie " + Registry.REGISTRY_PORT);
rejestr.rebind(nazwaSerwera, this);
System.out.println("SERWER : Zarejestrowano obiekt serwera ");
System.out.println("SERWER : Oczekuje na zgloszenia ");
} catch (Exception e)
{
System.out.println("SERWER : ");
e.printStackTrace();
System.exit(0);
}/*try ... catch*/
}/*Serwer_RMI*/
public void run()
{
//pobieramy pierwszego klienta z kolejki
while(true)
{
//informujemy wszystkich o kolejnosci do sekcji (poza klientem, ktory jest pierwszy, bo za chwile wchodzi)
//prezentacja stanu kolejki na serwerze
if(klienci.size() > 1)
{
for(int i = 1; i < klienci.size(); i++)
{
try
{
KlientInterface klient = (KlientInterface) klienci.get(i);
klient.wyswietlKomunikat("SERWER : Jestes " + (i) + " w kolejce");
klient.wyswietlKomunikat(komunikatZakazu + " ID klienta: " + klient.getIDKlienta());
System.out.println("SERWER : " + klient.getIPKlienta() + ":" + klient.getIDKlienta() + " jest " + i + " w kolejce");
} catch(Exception e) { e.printStackTrace(); }
}/*for*/
}/*if*/
if( sekcja_krytyczna == 0 && !(klienci.isEmpty()) )
{
KlientInterface klientWchodzacy = (KlientInterface)klienci.get(0);
klienci.remove(0);
sekcja_krytyczna = 1; //klient rezerwuje sekcje krytyczna
try
{
System.out.println(komunikatZezwolenia + " " + klientWchodzacy.getIPKlienta() + ":" + klientWchodzacy.getIDKlienta());
//opoznienie ustawiane na kliencie - symulowanie opoznien podczas przesylania przez siec
Thread.sleep( klientWchodzacy.getOpoznienie() );
klientWchodzacy.wyswietlKomunikat(komunikatZezwolenia + " " + klientWchodzacy.getIPKlienta() + ":" + klientWchodzacy.getIDKlienta());
//klient moze wejsc do sekcji
klientWchodzacy.wejscieDoSekcjiKrytycznej();
System.out.println("SERWER :" + " " + klientWchodzacy.getIPKlienta() + ":" + klientWchodzacy.getIDKlienta() + " wyszedl z sekcji krytycznej");
//po wyjsciu sekcja jest dostepna dla innych klientow
sekcja_krytyczna = 0;
}catch (Exception e) { e.printStackTrace(); }
}
}/*while*/
}/*run*/
/*rejestracja klienta - klient w kolejce do sekcji*/
public void rejestrujKlienta(KlientInterface obj) throws RemoteException
{
System.out.println("SERWER : Zamowienie klienta " + obj.getIPKlienta() + ":" + obj.getIDKlienta());
try
{
if(sekcja_krytyczna == 1)
{
obj.wyswietlKomunikat(komunikatZakazu + " " + obj.getIPKlienta() + ":" + obj.getIDKlienta());
obj.wyswietlKomunikat("SERWER : Podczas rejestracji jestes " + (klienci.size()+1) + " w kolejce");
}
klienci.add(obj);
System.out.println("\nSERWER : System rejestracji klientow");
KlientInterface klient;
for(int i = 0; i < klienci.size(); i++)
{
klient = (KlientInterface) klienci.get(i);
System.out.println("SERWER : " + klient.getIPKlienta() + ":" + klient.getIDKlienta() + " jest " + (i+1) + " w kolejce");
}
System.out.println("");
} catch(Exception e) { e.printStackTrace(); }
}
public static void about()
{
System.out.println("");
System.out.println("\t########################################################");
System.out.println("\t# SERWER SYNCHRONIZACJI DOSTEPU DO SEKCJI KRYTYCZNEJ #");
System.out.println("\t# #");
System.out.println("\t# autor: Szymon Bogdanski #");
System.out.println("\t########################################################");
System.out.println("");
}
public static void main(String[] args)
{
about(); // o programie ...
System.setProperty("java.security.policy", "serwer.policy");
System.setSecurityManager( new RMISecurityManager() );
System.out.println("\nSERWER : Zainstalowano zarzadce bezpieczenstwa");
//utworzenie dostawcy uslugi
try
{
Serwer_RMI serwer = new Serwer_RMI();
Thread watekSerwera = new Thread(serwer, "Serwer");
watekSerwera.start();
} catch (RemoteException e) { e.printStackTrace(); }
}/*main*/
}/*Serwer_RMI*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -