Kolejne zadanie składa się z dwóch części.

Pierwszą częścią zadania będzie modyfikacja programu EIS na wersję klient-serwer. Dotychczasowy program należy podzielić na dwa programy: klienta realizującego interfejs użytkownika, i serwer realizujący dostęp do bazy danych. Programy powinny komunikować się przez gniazdka domeny Unix.

Klient ma umożliwiać użytkownikowi przeglądanie zawartości indeksu EIS. Z założenia, klientów może być wielu, pracujących równolegle.

Serwer będzie osobno uruchamianym, nieinterakcyjnym programem obsługującym bazę danych, i przystosowanym do odpowiadania na (prawie) jednoczesne żądania od różnych klientów.

Proszę rozważyć dwie możliwości implementacji serwera, omówione na wykładzie. Pierwsza to wersja wieloprocesowa, tzw. współbieżna, z tworzeniem podprocesu dla obsługi każdego klienta. W tym przypadku konieczne będzie stosowanie blokad na bazę danych, podobnie jak w wersji monolitycznej programu EIS. Druga możliwość to wersja jednoprocesową, tzw. iteracyjna. W tym przypadku serwer obsługuje wszystkich klientów w jednym procesie, i wtedy obsługa pojedynczych żądań musi być albo bardzo szybka, albo musi być podzielona na kawałki i serwer musi być w stanie obsługiwać jednocześnie wielu klientów kawałek po kawałku. Ponieważ tylko jeden proces ma dostęp do bazy danych, blokady są w tym przypadku niepotrzebne.

Wskazówka: realizacja współbieżna jest typowo łatwiejsza. Realizacja iteracyjna wymaga staranniejszego zaplanowania komunikacji klientów z serwerem, ale jest to wersja ciekawsza.

Dla komunikacji między klientami a serwerem należy opracować mini-protokół komunikacyjny określający jaka będzie treść i format żądań przesyłanych serwerowi przez klientów, oraz jaka będzie treść, format, i reżim czasowy odpowiedzi serwera, a także ich odczytania przez klientów.

Drugą częścią zadania jest zaimplementowanie klienta systemu EIS za pomocą biblioteki curses omawianej na wykładzie. Celem jest czytelne i wygodne zorganizowanie interakcji z użytkownikiem, zarówno w zakresie menu operacji, jak i prezentacji wyników otrzymanych od serwera. Interfejs powinien być skromny, proszę testować jego wygląd i zachowanie nie tylko na różnych systemach, ale również na różnych emulatorach terminala. Mają one różne możliwości, i niektóre nie będą wyświetlać wszystkich atrybutów, których ustawianie umożliwia biblioteka curses. Na przykład, wszystkie terminale obsługują podświetlanie (atrybut A_REVERSE), ale wiele terminali nie obsługuje tekstu migającego, pogrubionego, pocienionego, pochyłej czcionki, itp. (Tekst migający jest dodatkowo dość irytujący.)

Proszę zwrócić uwagę na przypadek wyboru większej partii danych (przez wyrażenie regularne) i zaimplementować poprawną obsługę tego przypadku. Na przykład, gdyby klient zażądał wyszukania jakichś danych (studentów lub ocen) wyrażeniem, które zwróci ich bardzo dużo (> 1000), to program klienta nie może wyświetlić ich wszystkich na ekranie. Nie może również zmuszać użytkownika do oglądania ich wszystkich ekran po ekranie. Musi być możliwość porzucenia nieobejrzanych wyników, i realizacji nowego żądania.