КДП/Пројекат

Извор: SI Wiki
< КДП
Датум измене: 1. октобар 2022. у 19:44; аутор: Renatus (разговор | доприноси) (informacije o kdp projektu od `<@375945068906938369>` koji je jedini branio projekat ikada)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

КДП пројекат носи 20 бодова, покрива градиво са лабораторијских вежби, ради се у Јави 11 и подразумева прављење дистрибуираних програма са графичким интерфејсом који међусобно комуницирају на један од два начина, Мрежна комуникација (Соцкети, Мрежно програмирање) или Ремоте метход инвоцатион (РМИ, Удаљени позиви процедура). Како је у оба случаја могуће да више програма контактира један други програм истовремено, конкурентни део задатка се односи на то да се такви случајеви обраде коректно користећи неке од синхронизационих механизама јаве. Све информације су само додатак или смернице на оно што је обрађено на лабораторијским вежбама тако да се подразумева да сте већ одгледали снимке/прочитали презентације са лабораторијских вежби. Није потребно гледати снимке за Мрежну комуникацију ако пројекат користи РМИ, и обрнуто.

Обично се праве следеца три програма:

  • Централни сервер - главни сервер који комуницира са свим подсерверима
  • Подсервер - сервери који служе као посредник између централног сервера и корисничких апликација
  • Корисничка апликација - комуницира са подсерверима за своје потребе

Пројекат се брани најкасније у року у коме се ради дистрибуирани део и он се мења свака 2 или више рока, у зависности да ли је неко уопште бранио текући пројекат. Могуће је да се појави један од пројеката који је претходно био.

Претходни пројекти и њихова решења:

  • Берзинско пословање (Мрежна комуникација | РМИ)
  • Дистрибуирано гледање видео садржаја (Мрежна комуникација | РМИ)
  • Дистрибуирани документи (Мрежна комуникација | РМИ)

Дозвољено је коришћење екстерних библиотека.

Информације

Мрежна комуникација (јава.нет)

Овом одељку фале информације. Помозите СИ Wики тако што ћете додати потребне информације.

Ремоте Метход Инвоцатион (јава.рми)

Успостављање међусобне конекције

Потребно је само централни сервер уписати у РМИ регистар. Подсервери и клијентске апликације је боље имплементирати преко проширења УницастРемотеОбјецт-а како би они добили анониман порт и тиме избегла потреба за прављење система за ускљађивање слободних портова или ручне промене порта при покретању апликација. УницастРемотеОбјецт-и се могу преко РМИ методе слати другим апликацијама и тако успоставити конекција.

public class CentralServer implements CentralServerInterface {
	// ...
    
	public CentralServer(int port, boolean nogui) throws RemoteException {
		// ...
		LocateRegistry.createRegistry(port).rebind("/Central", UnicastRemoteObject.exportObject(this, 0));
		// ...
	}
    
	@Override
	public void addSubserver(SubserverInterface subserver) {	// preko subserver.metodaPodservera(...) možemo da pristupamo udaljenom podserveru
		// ...
        // dodavanje u listu podservera ili neka druga obrada
		// ...
	}
    // ...
}
public class Subserver extends UnicastRemoteObject implements SubserverInterface, Serializable {
	// ...
    private CentralServerInterface centralServer;
    // ...
    
	private void connectToCentral(String centralHost, int centralPort) {
		// ...
		centralServer = (CentralServerInterface) LocateRegistry.getRegistry(centralHost, centralPort).lookup("/Central");
        centralServer.addSubserver(this, ...);
		// ...
	}
    // ...
}

Грешке

Грешке раде како је и очекивано, грешке бачене кроз удаљену процедуру се третирају као да су локално бачене.

Грешке изазване прекидима везе

Поред РемотеЕxцептион, у зависности у којој фази удаљеног позива се десила грешка са везом, могу да се појаве и још неке грешке:

  • ЦоннецтЕxцептион
  • СерверЕxцептион
  • СоцкетТимеоутЕxцептион

Пошто документација доступна на интернету није баш потпуна, могуће је да ни ова листа није потпуна. Све ове грешке се изводе из ИОЕxцептион грешке.

Тимеоут

Подразумевани тимеоут за РМИ је 2 сата, а како су РМИ позивији блокирајући ово је непогодно. Подразумевани тимеоут може да се промени линијом:

System.setProperty("sun.rmi.transport.tcp.responseTimeout", "10000");
public class CentralServer implements CentralServerInterface {
	static {
    	System.setProperty("sun.rmi.transport.tcp.responseTimeout", "10000"); // vreme je u milisekundama
		// ...
	}
    // ...
}

Трансфер фајлова

Трансфер фајлова је могуће одрадити тако што се прво фајл претвори у бyте низ, пошаље се бyте низ преко РМИ методе и онда пребаци назад у фајл на рачунару на који се шаље.

Како ти фајлови могу бити неодређене величине, потребно је читати и слати те фајлове у деловима.

public class CentralServer implements CentralServerInterface {
	private void sendFile(String path, int fileID, SubserverInterface subserver) {
		try (InputStream is = new FileInputStream(path)) {
			int readBytes;
			byte[] data = new byte[MAX_SIZE]; // maksimalna kolicina podataka koja se šalje po jednom pozivu metode, gledati da ne bude toliko velika da prekoraci postavljeni timeout
            // MAX_SIZE = 1024 * 1024 * 8 bi znacilo da se šalje do 8MB po pozivu metode
			
			while ((readBytes = is.read(data)) != -1) subserver.uploadFile(fileID, data, readBytes);
				
			// zavisi od vaše implementacije, ali ovde bi npr. mogla metoda koja govori da je fajl ceo poslat - subserver.finalizeFile(file);
		} catch (IOException e) {
			// obrada greške, sve RMI greške sa vezom se izvode iz IOException
		}
	}
}
public class Subserver extends UnicastRemoteObject implements SubserverInterface, Serializable {
	// ...
	private final HashMap<Integer, String> files = new HashMap<>();	// čuva putanju do fajla u koji se upisuje, ili neku složeniju strukturu po potrebi
    // ...
    
    @Override
	public void uploadFile(int fileID, byte[] data, int readBytes) {
		// zavisi od zadatka, moguće da će biti potrebna neka sinhronizacija ovde
        
        try (OutputStream os = new FileOutputStream(files.get(fileID), true)) {	// prvi parametar FileOutputStream-a je path gde će se fajl nalaziti, drugi paramtetar je da li se dodaje na kraj već postojećeg fajla ili se pravi novi
        	os.write(data, 0, readBytes);
		} catch (IOException e) {
			// obrada greške
		}
	}
}

Тестирање

Тестирање је најбоље вршити са више рачунара повезаних у исту мрежу. ИП адреса програма на који се везујете је ИПв4 адреса мрежног интерфејса преко којег тај програм приступа мрежи. Њу можете наћи куцањем команде ипцонфиг у Цомманд промпт-у на рачунару на коме је тај програм покренут. Алтернативно, програмски можете доћи до ње (мада ова метода није 100% сигурна да даје адресу правог интерфејса), преко Стринг ип = ИнетАддресс.гетЛоцалХост().гетХостАддресс(); (корисно кад хоћете да испише ИП адресу без да мора да се пали Цомманд промпт).

Могући тестови:

  • Нагло гашење неког од програма (централног сервера, подсервера, корисничке апликације).
  • Вађење кабла за интернет или гашење Wи-Фи везе за време рада програма.

Ова два теста треба извршити у разним ситуацијама у којима програм може да се нађе са различитим комбинацијама покренутих програма на сваком рачунару.

Могуће је тестирати пројекат и у сали П26, само што се од дежурног мора затражити да се искључи жаштита која блокира РМИ позиве између рачунара. Наговестити да је за КДП пројекат, администратори би требало да знају шта искључују у том случају. Логовање на више рачунара одједном преко истог налога не прави проблем.

Извештај

Извештај се пише по спецификацији наведеној у поставци пројекта и представља тотално губљење времена којег већ немате.

Како опис самог формата извештаја заузима 50% целог текста пројекта, доступан је и празан извештај који можете да попуните.

За израду дијаграма може да се користи СтарУМЛ.

Велика је шанса да се на одбрани неће ни улазити у извештај, али како се он шаље уз изворни код пројекта могуће је да ће неко са предмета ући у њега и пажљиво га прочитати.

Одбрана

Одбрана се одржава у некој рачунарских сала факултета.

На одбрани је потребно да се покрену програми на 4 рачунара одједном тако да различити рачунари комуницирају међусобно. Пројекат се онда презентује и демонстрира (укључујући неке ситуације при губитку везе), а затим се задаје нека ситна модификација. Питања везана за пројекат се односе на то како је неки део имплементиран.

Доступан је приступ интернету.