Курсов проект № 1 по “Интернет програмиране с Java”

1.7. Offline Chat

Автори: Димитър Георгиев,

Светлин Наков

Версия: 0.9

Последна промяна: 23.03.2004

Да се напише програма на Java, която използвайки възможностите на пакета java.net реализира сървър за offline обмяна на съобщения между различни потребители (offline chat server). Потребителите имат уникални имена съставени само от малки латински букви. Имената на чат стаите започват със символа # и се състоят също само от малки латински букви.

Клиентските приложения си комуникират със сървъра чрез изпращане на команди. Всяка команда се състои от 1 текстов ред, на който сървърът отговаря също с 1 текстов ред. След логване в сървъра потребителят може да получи съобщенията, които са се натрупали за него, докато е бил offline, може да изтрива съобщения, да изпраща съобщения и да влезе в режим за директно получаване на съобщения. Съобщенията и каналите трябва да се пазят в текстов файл и да не се губят ако сървърът се спре временно. Потребителят може да разглежда съобщенията си по номер по всяко време. Номерата на съобщенията за всеки потребител трябва да са уникални и по-късно изпратените съобщения трябва да имат по-голям номер от по-рано изпратените. Всяко съобщение има изпращач, получател, дата и час.

Сървърът трябва да слуша на TCP порт 3334 и да разпознава и изпълнява следните команди:

LOGIN username password – автентикира потребител. Валидните имена на потребители и техните пароли да се четат от текстов файл. Тази команда се използва само в началото, след като клиентското приложение се свърже към сървъра. Пример:

клиент:

LOGIN pesho !tajna##17834

сървър:

+OK. Welcome pesho.

Друг пример:

клиент:

LOGIN pesho mente

сървър:

-Error: Invalid username/password

Останалите команди са валидни само след успешно изпълнение на командата LOGIN:

LIST – връща списък с всички съобщения получени в сървъра за текущия потребител. Съобщенията са сортирани по уникалния им номер. За всяко съобщение се извежда неговия номер, дата и час, потребител-изпращач и съдържание. За разделител се използва символа “”. Всяко съобщение се състои от един единствен ред. За край на списъка се изпраща празен ред. Пример:

клиент:

LIST

сървър:

+OK. You have 4 offline messages:

8139 – 22.03.2004 11:44 – kiro - pesho, tuk li si?

8144 – 22.03.2004 21:17 - penka – ajde idvaj, kuponma pochna

8146 – 22.03.2004 22:03 – minka – iskash li da mi dojdesh na gosti? sama sym. sykvartirantkata si zamina za Shabla. imam strahotno vince

8210 - 22.03.2004 22:07 – kiro – pesho, stiga s tezi zeni, idvaj da porkame, vzel sym ot onaya Rakiya na diado mi

 

DELETE <message_id> – Изтрива съобщение по неговия номер. Ако не е зададен номер, изтрива всички съобщения. Пример:

клиент:

DELETE 8146

сървър:

+OK. Message 8146 deleted.

Още един пример:

клиент:

DELETE 22238146

сървър:

-Error: Message 22238146 not found.

Още един пример:

клиент:

DELETE

сървър:

-OK. All your offline messages were deleted.

LISTEN – преминава в режим на слушане, като връщане в команден режим не е възможно. В режим на слушане потребителят получава директно всички съобщения, предназначени за него. Пример:

клиент:

LISTEN

сървър:

+OK. Entered listening mode.

(wait for some message to arrive)

8144 – 22.03.2004 21:17 - penka – ajde idvaj, kuponma pochna

(wait for some message to arrive)

8146 – 22.03.2004 22:03 – minka – iskash li da mi dojdesh na gosti? sama sym. sykvartirantkata si zamina za Shabla. imam strahotno vince

(wait for some message to arrive)

8210 - 22.03.2004 22:07 – kiro – pesho, stiga s tezi zeni, idvaj da porkame, vzel sym ot onaya Rakiya na diado mi

(wait for some message to arrive ...)

Форматът, в който пристигат съобщенията е същият като при командата LIST. Съобщенията могат да пристигат в произволен момент (когато някой се сети да изпрати нещо до текущия потребител). Сървърът в този режим не приема никакви команди.

SEND user message – изпраща съобщение на зададения потребител. На съобщението се съпоставя уникален номер и то се записва в списъка на съобщенията на дадения потребител. Ако потребителят получател е свързан със сървъра в този момент в решим на слушане, той получава директно съобщението. Изпратените директно съобщения не се добавят в списъка за съответния потребител. Пример:

клиент:

SEND kiro idvaj da porkame u doma

сървър:

+OK. Message sent.

Пример за грешка:

клиент:

SEND kircata idvaj da porkame u doma

сървър:

-Error: Unknown user [kircata].

SEND * message – изпраща съобщение на всички потребители в системата. Съобщението се изпраща до списъка със съобщения на всеки потребител. Всички потребители, които са свързани със сървъра в този момент в решим на слушане, получават директно съобщението. Изпратените директно съобщения не се добавят в списъка за съответния потребител. Пример:

клиент:

SEND * idvajte vsichki, na 6-tia etaz ima kupon v chitalniata

сървър:

+OK. Message sent.

CREATEROOM #room_name – създава канал (чат стая) със зададеното име. Пример:

клиент:

CREATEROOM #java

сървър:

+OK. Chat-room created.

Още един пример:

клиент:

CREATEROOM #java

сървър:

-Error: Chat-room #java already created.

JOIN #room_name – включва текущия потребител към зададения канал (чат стая). Пример:

клиент:

JOIN #java

сървър:

+OK. Entered #java.

Още един пример:

клиент:

JOIN #java2

сървър:

-Error: Invalid chat-room #java2.

LEAVE #room_name – изключва текущия потребител от зададения канал (чат стая). Пример:

клиент:

LEAVE #java

сървър:

+OK. Leaved chat-room #java.

Още един пример:

клиент:

LEAVE #java

сървър:

+Error: Yu are not in #java2 chat-room.

SEND #room_name message – изпраща съобщение на всички потребители от даден канал (чат стая). Съобщението се изпраща до списъците със съобщения за всеки от тези потребители. Всички потребители от зададения канал, които са свързани със сървъра в този момент в решим на слушане, получават директно съобщението. Изпратените директно съобщения не се добавят в списъка за съответния потребител. Пример:

клиент:

SEND #java idvajte vsichki u doma, sha uchim po Java!

сървър:

+OK. Message sent.

Забележка: Няколко отделни клиента могат да използват сървъра от името на един и същ потребител по едно и също време. Например даден потребител може да влезе веднъж, за да изпраща съобщения и още веднъж, за да слуша за нови съобщения, идващи от другите потребители.

Не е задължително да пишете клиентско приложение. За клиент може да се използва стандартен telnet.