Курсов проект № 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.