Комп'ютерні науки > Yava технологія.Основні риси та персрективи застосування
Розподіленість. Мова Java призначена для створення програм, які працюють в розподіленому середовищі Internet на базі протоколів TCP/IP. Насправді доступ до ресурсів за допомогою URL відрізняється від доступу к файлу. Крім того в Java наявний засіб передачі повідомлень в межах внутрішнього адресного простору. Це дозволяє забеспечити віддалене виконання процедур. Ці інтерфкйси включені у пакет RMI (remote metod invocation). Цей засіб привносить високий рівень абстракції в програмування дл я середовища клієнт/сервер. Java-програми несуть у собі значний обсяг інформації про типи часу виконання (run-time type information), яка використовується для дозволу доступу до об’єктів під час роботи програми. Це дозволяє забезпечити безпечну та оптимальну динамічну компоновку. В такий спосіб досягається захищеність середовища виконання аплетів. Доступність інструментарію та ефективність розробок. Зазначена вище простота програмування на Java є причиною того, що розробки на Java коштуватимуть дешевше аналогічних на більш потужніх мовах програмування. Цьому ж сприяє і переносимість програм на Java, оскільки ліквідуються витрати пов’язані з адаптацією програми на конкретній платформі. До того ж інтегровані програми-оболонки для розробки Java програм коштують набагато дешевше ( 70-100$ ) ніж аналогічні продукти C++, Delphi ( ~1000$). А набір інструментарію для пакетної компіляції Java програм JDK (Java Development Kit) є взагалі freeware. Тому платформу Java можна рекомендувати як ідеальну для створення некомерційних програмних продуктів, зокрема для галузі освіти. Перспективи застосування. Програми на Java можуть знайти різне застосування в навчальному процесі: інтерактивні навчаючі програми (HTML в поєднанні з Java), програми-тести і особливо ділові ігри. Додаткові переваги можна отримати, якщо пистати ці програми у вигляді аплетів, які ініціалізуються з Web сервера внутрішньої мережі Intranet. В такий спосіб можна уникнути інсталяції програми на багатьох комп’ютерах - користувач просто запускає Web-броузер і загружає потрібну сторінку. Для тестових програм, написаних на Java з викориситанням архітектури клієнт/сервер можна підвищити ступінь конфіденційності. База даних тестових запитань знаходиться на сервері в каталозі з обмеженим доступом. Коли користувач загружає аплет, він автоматично підключається до програми-сервера, яка виконується на сервері і може видавати запитання з бази даних у відповідь на запит користувача. В такий спосіб унеможливлюється викрадення бази даних, за умови відсутності фізичного доступу до серверу у користувачів. Окреме питання - навчальні ділові ігри. Під такою грою розумітимем гру, за участю кількох користувачів, в якій мається на увазі динамічний обмін інформацією між ними. Система безпеки Java накладає обмеження, внаслідок якого аплет може встановлювати з’єднання лише з хостом, з якого він був загружений і ні з яким більше. Але це обмеження легко обходиться: на сервері виконується програма-сервер, з якою з’єднуються усі клієнти і через яку здійснюється обмін інформацією. Таким чином така програма повинна мати архітектуру клієнт/сервер. В якості приклада наведу спрощену chat-програму. В ній реалізовані базові засоби для створення ділової гри. Серверна частина програми взята з книги Нотон П. Шилдт Г. «Полный справочник по Java»:-Киев, «Диалектика», 1997 і є практично універсальною для програм такого класу. Можливе легке доопрацювання цієї програми в бік розширення кількості протокольних команд. Клієнтська частина була написана мною. Програма працює наступним чином: користувач запускає аплет із сервера, вводить свій ідентифікатор і бачить перелік ідентифікаторів користувачів, які під’єднані до сервера. Після чого користувач має змогу обмінюватись повідомленнями з іншими. Користувач одержує повідомлення в разі під’єднання або від’єднання користувачів. Програма складається з 4 класів: Server, ClientConnection, Client та ServerConnection. Перші 2 класи відносяться до серверної частини, другі 2 - до клієнтської. Клас Server: import java.net.*; import java.io.*; import java.util.*; public class Server implements Runnable { private int port = 6564; private Hashtable idcon = new Hashtable(); private int id = 0; static final String CRLF = "\r\n"; synchronized void addConnection(Socket s) { ClientConnection con = new ClientConnection(this, s, id); id++; } synchronized void set(String the_id, ClientConnection con) { idcon.remove(the_id) ; con.setBusy(false); Enumeration e = idcon.keys(); while (e.hasMoreElements()) { String id = (String)e.nextElement(); ClientConnection other = (ClientConnection) idcon.get(id); if (!other.isBusy()) con.write("add " + other + CRLF); } idcon.put(the_id, con); broadcast(the_id, "add " + con); } synchronized void sendto(String dest, String body) { ClientConnection con = (ClientConnection)idcon.get(dest); if (con != null) { con.write(body + CRLF); } } synchronized void broadcast(String exclude, String body) { Enumeration e = idcon.keys(); while (e.hasMoreElements()) { String id = (String)e.nextElement(); if (!exclude.equals(id)) { ClientConnection con = (ClientConnection) idcon.get(id); con.write(body + CRLF); } } } synchronized void delete(String the_id) { broadcast(the_id, "delete " + the_id); } synchronized void kill(ClientConnection c) { if (idcon.remove(c.getId()) == c) { delete(c.getId()); } } public void run() { try { ServerSocket acceptSocket = new ServerSocket(port); System.out.println("Server listening on port " + port); while (true) { Socket s = acceptSocket.accept(); addConnection(s); } } catch (IOException e) { System.out.println("accept loop IOException: " + e); } } public static void main(String args[]) { new Thread(new Server()).start(); try { Thread.currentThread().join(); } catch (InterruptedException e) { } } } Цей невеликий клас реалізує програму-сервер. Точка вхолу програми - функція main. В програмі створюється головний потік, в якому створюється об’єкт стандартного класу ServerSocket. Цей об’єкт приєднується до певного порта і в циклі здійснюється перевірка на підключення клієнта до порта. В разі такого підключення створюється об’єкт типу ClientConnection, в якому реалізований потік по опитуванню сокета, до якого підключений клієнт, та обробка протокольних команд. Клас Server є універсальним і нічого не знає про повідомлення, якими обмінюються гравці (клієнти). В ньому реалізоване лише приєднання/від’єднання клієнтів, надсилання строки певному клієнту та функція broadcast яка, як зрозуміло з назви, надсилає повідомлення усім зареєстрованим клієнтам. Клас ClientConnection: import java.net.*; import java.io.*; import java.util.*; class ClientConnection implements Runnable { private Socket sock; private DataInputStream in; private OutputStream out; private String host; private Server server; private static final int bufsize = 8192; private byte buffer[] = new byte[bufsize]; private static final String CRLF = "\r\n"; private String name = null; private String id; private boolean busy = false; public ClientConnection(Server srv, Socket s, int i) { try { server = srv; sock = s; in = new DataInputStream(s.getInputStream()); out = s.getOutputStream(); host = s.getInetAddress().getHostName(); id = "" + i; // tell the new one who it is... write("id " + id + CRLF); new Thread(this).start(); } catch (IOException e) { System.out.println("failed ClientConnection " + e); } } public String toString() { return id + " " + host + " " + name; } public String getHost() { return host; } public String getId() { return id; } public boolean isBusy() { return busy; } public void setBusy(boolean b) { busy = b; } public void close() { server.kill(this); try { sock.close(); // closes in and out too. } catch (IOException e) { } } public void write(String s) { byte buf[] = new byte[s.length()]; s.getBytes(0, buf.length, buf, 0); try { out.write(buf, 0, buf.length); } catch (IOException e) { close(); } } private String readline() { try { return in.readLine(); } catch (IOException e) { return null; } } static private final int NAME = 1; static private final int QUIT = 2; static private final int TO = 3; static private final int DELETE = 4; static private Hashtable keys = new Hashtable(); static private String keystrings[] = { "", "name", "quit", "to", "delete"
Назва: Yava технологія.Основні риси та персрективи застосування Дата публікації: 2005-02-22 (1892 прочитано) |