Реферат: Java технологія и основні риси та перспективи застосування
Javaтехнологія.Основні рисита перспективизастосування.Зміст.Походження Java.
Безпечність.
Ефективність.
а) прозорість інтерфейсів;
б) легкість програмування;
Об’єктно-орієнтована спрямованість.
Стійкість до помилок.
Підтримка багатопоточності.
Незалежність від архітектури.
Переваги інтерпретованості в поєднанні з високою продуктивністю.
Розподіленість.
Доступність інструментарія.
Перспективи застосування
Резюме.
Джерела інформації.
2
2
3
4
4
5
5
6
6
7
7
20
21
.
ПоходженняJava.
Мова програмуванняJavaзародиласяв 1991р. в лабораторіяхкомпанії SunMicrosystems inc. Як недивно, поштовхомдля створенняJavaстала зовсімнеInternet. Головниммотивом булапотреба в мовіпрограмування, яка не залежалаб від платформи( тобто відархітектури) і яку можнабуло б використовуватидля створенняпрограмногозабезпечення, яке вбудовуєтьсяв різноманітніпобутові електронніприлади, такіяк мобільнізасоби зв’язку, пристроїдистанційногоуправліннятощо. Розробкапершої робочоїверсії зайняла18 місяців і вонамала назву«Oak», але 1995 р. проектбув перйменованийна «Java».
ПеріодстановленняJavaспівпав зачасом з розквітомміжнародноїінформаційноїслужби WorldWide Web. Ця обставинавідігралавирішальнуроль в иайбутньомуJava, оскільки Webтеж вимагалапереносимихпрограм. Якнаслідок, булизміщені акцентив розробці Sun з побутовоїелектронікина програмуваннядля Internet.
Безпечність.
WorldWide Web висунулаJavaна переднійкрай програмування,і Java, в свою чергу, сильно вплинулаі навіть змінилаобличчя Internet, розширившиспектр об’єктів, які можутьрозповсюджуватисьу кіберпросторі.Програми новоїформи — аплети- завантажуютьсяз віддаленогосервера і можутьзапускатисядинамічно, тобто без участікористувача.До появи Javaтакий підхідбув неприпустимийз міркуваньбезпеки тапереносимості.В архітектуріаплетів зробленоряд штучнихобмежень, якіроблять їхцілком безпечними.Перш за все,Javaє інтерпретованоюмовою і простірресурсівJava-програмиобмежений такзваною віртуальноюJava-машиною(VJM), яка може конторолюватиповедінкупрограми ізахищати системувід побічнихефектів, якіможуть виникатиз вини аплета.Крім того, вмові Javaє додатковіобмеження, якіне дозволятьаплету стати«троянськимконем». Зокрема,Java-аплетне може отриматидоступ до локальногожорсткогодиску. При такійспробі генеруєтьсявиключна ситуація.
Ефективність.
Оскількиаплети Javaінтерпретуються, а не компілюються, то їх виконанняна різних платформахзначно полегшується.В цьому випадкудостатньостворити длякожної платформивиконуючуJava-систему.Якщо існує такасистема дляданої операційноїсистеми, тобудь-яка Java-програмаможе виконуватисьв даному середовищібез додатковоїкомпіляціїна цій платформі.Проте Javaне є інтерпретованоюмовою в чистомурозумінні.Програма наJavaкомпілюється.Результатомроботи компілятораJavaє байткод (bytecode).Байткод — цеоптимізованийнабір команд, призначенийдля виконанняуявним пристроєм- віртуальноюJava-машиною.В такий спосібвитрати наінтерпретаціюзводяться домінімуму, оскількибайкод вже єоптимізованим,і досягаєтьсядосить високапродуктивністьJava-програм.Наведені вищеособливостідають підставурозглядатиJavaне як ще однумову програмування, а як окремуінформаційнутехнологію.Таким чином,інтерпретація- це найлегшийшлях до перенесенняпрограм, реалізованийв Javaтехнології.Незважаючина те, що моваJavaбула розробленав розрахункуна інтерпретацію, технічно немаєнічого такого, що б перешкоджалокомпіляціїбайткоду в виконуванийкод. До байткоду, який пересилаєтьсяпо мережі, застосовуєтьсядинамічнакомпіляція, але це ніяк невпливає напереносимістьта безпеку, оскільки роботупрограми всеще контролюєвиконуючасистема. Такийпідхід застосованов багатьохвиконуючихсистемах Java, що забезпечуєпродуктивністьна рівні оптимізованогокоду С++.
Мова Javaє однією знаймолодшихв сімействімов програмуваняі була розробленаз розрахункуна те, щоб професійнийпрограмістміг легко їїопанувати таефективновикористовувати.За основу Javaвзятий синтаксисС++ — безсумнівнооднієї з найбільшпопулярнихмов програмуваннясучасності.Проте, Java- це цілкомсамостійнамова програмування,і при її створенніне йшлося пробудь-яку сумісністьз С++. Тому деякімеханізмиреалізованів Javaінакше, а деякізовсім відсутні.Ідеологічнож Javaпобудованадещо інакшеніж С++. РозробникиJavaгрунтувалисяна досвідірозробки програмна С++ і прагнулипозбутисяможливостей, які зарекомендувалисебе непевними.Так, в Javaвідсутня перегрузкаоператоріва також автоматичнеприведеннянесуміснихтипів — конструкції, які при неуважномувикористанніє джереломважких длявиявленняпомилок. Взагалі,інтерфейсиJavaбільш простіта прозорі длярозуміння.Написати наJavaпрограму зграфічнимінтерфейсомзначно легше.Звичайно, простотаінтерфейсівкомпенсуєтьсяменшою гнучкістю, бібліотекаJavaне така багата, як стандартнібібліотекиС/С++. Але згадаймо, що Javaзадуманий длявикористанняна різних платформахі тому реалізуєв собі найбільшстандартніможливостізадля легшоїадаптації підконкретнесередовище.
Об’єктно-орієнтованаспрямованість.
Від С++ Javaуспадкувалапотужний механізмоб’єктно-орієнтованогопрограмування.Оскільки Javaрозроблювався«на пустомумісці», тобтоне було потребизабезпечуватисумісністьз попереднімиверсіями, розробникимали повнусвободу мислення.В результатібув сформованийясний і прагматичнийпідхід до об’єктів.Вільно переймаючиідеї, які реалізовувалисяпротягом останніхдесятирічь, мові Javaвдалося знайтирівновагу міжпарадигмою«все є об’єктом»і прагматичнимпідходом. Об’єктнамодель Javaпроста і легкорозширюється, в той час якпросі типи, якцілі, зберігаютьсяяк дані, що неє об’єктами, що дозволяєзначно підвищитишвидкість приїх обробці.
Стійкістьдо помилок.
БагатоплатформеністьсередовищаWebвисуває надзвичайновисокі вимогидо надійностіпрограм. Якнаслідок, прирозробці Javaприорітет буввідданий можливостіствореннястійких допомилок програм.Java звільняєпрограміставід хвилюваньз приводу багатьохпоширенихпричин, яківикликаютьпомилки програмування.Як вже згадувалося,Javaє строго типіованоюмовою програмування.Ще виконуючасистема Java бере на себе«прибираннясміття», тобтоавтоматичнозвільняє пам’ять, яка була розподіленадинамічно.Звичайно, цедещо знижуєефективністькоду, але запобігаєтипових помилок, коли програмістзабуває звільнитивиділену пам’ять, або, навпаки, звільняє пам’ять, яка ще використовується.Javaпідтримуєоб’єктно-орієнтовануобробку виключнихситуацій подібнодо С++. Але навідміну відС++ в Javaобробка виключнихситуацій єобов’язкувою.Тобто неможливоскомпілюватипрограму, якавідкриває файл, не обробившиможливі помилкитипу «файл незнайдено», яківиникають прицьому. ДобренаписанаJava-програмаможе сама оброблятивсі помилкичасу виконання.
Підтримкабагатопоточності.
Javaрозробляяласяз орієнтацієюна вимоги достворенняінтерактивнихпрограм, якіпрацюють змережею. З цієюметою Javaпідтримуєбагатопоточнепрограмування, яке дозволяєлегко розроблятипрограми, щовикинуютьбагато процесіводночасно.ВиконанняJava-програмизасновано наелгантному, але в той самийчас високоорганізованомурішенні багатопроцесовоїсинхронізації, яке дозволяєвам створювативисокоефективніінтерактивнісистеми.
Незалежністьвід архітектури.
Основнимпитанням длярозробниківJavaстало питаннядовготривалостіта переносимості.Одна з головнихпроблем, із якою зустрілисяпрограмісти, полягала ввідсутностігарантій того, що написанасьогодні програмазавтра працюватимез тим же успіхом, причому на тійсамій машині.Оновленняопераційноїсистеми, модернізаціяпроцесора тазміна об’ємуоперативноїпам’яті можутьпризвести дозбою програми.РощзробникиJava, прагнули змінитицю ситуаціюі прийнялидекілька важкихрішень відносномови Javaта процесувиконанняJava-програми.Їх мета полягалав тому, щоб «одногоразу написанепрацюваловсюди, в любийчас і завжди».Внаслідок цьогоJavaє системою, якалегко розширюєтьсяза рахунокстворення новихстандартнихкласів та бібліотек.
Перевагиінтерпретованості в поєднанніз високоюпродуктивністю.
Як вже згадувалось,Javaдозвляє створюватинезалежні відплатформипрограми шляхомкомпіляціїв проміжнепредставлення, яке називаєтьсябайткодом.Багато попередніхспроб зпробзнати розв’язокпроблеми незалежностівід платформибули зробленіза рахунокпродуктивності.Інтерпретуючісистеми, подібнідо BASIC,Perl, страждаютьна майже неподоланнийдефіцит продуктивності.Це було врахованопри створенніJava…Незважаючина те, що Javaє інтерпретованоюмовою, генераціябайткодів буларетельно оптимізованав такий спосіб, щоб одержуванийбайткод можнабуло легкоперекладатив машинний код, який працюєз дуже високоюпродуктивністю.Виконуючісистеми такогороду не втрачаютьжодних перевагпереносимогокоду.
Розподіленість.
Мова Javaпризначенадля створенняпрограм, якіпрацюють врозподіленомусередовищіInternetна базі протоколівTCP/IP.Насправдідоступ до ресурсівза допомогоюURLвідрізняєтьсявід доступук файлу. Крімтого в Javaнаявний засібпередачі повідомленьв межах внутрішньогоадресногопростору. Цедозволяє забеспечитивіддаленевиконанняпроцедур. Ціінтерфкйсивключені упакет RMI(remote metod invocation). Цейзасіб привноситьвисокий рівеньабстракціїв програмуваннядл я середовищаклієнт/сервер.
Java-програминесуть у собізначний обсягінформаціїпро типи часувиконання(run-timetype 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:
importjava.net.*;
importjava.io.*;
importjava.util.*;
publicclass Server implements Runnable {
privateint port = 6564;
privateHashtable idcon = new Hashtable();
privateint id = 0;
staticfinal 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());
}
}
publicvoid 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);
}
}
publicstatic void main(String args[]) {
newThread(new Server()).start();
try {
Thread.currentThread().join();
}catch (InterruptedException e) {
}
}
}
Цей невеликийклас реалізуєпрограму-сервер.Точка вхолупрограми — функціяmain.В програмістворюєтьсяголовний потік, в якому створюєтьсяоб’єкт стандартногокласу ServerSocket.Цей об’єктприєднуєтьсядо певногопорта і в цикліздійснюєтьсяперевірка напідключенняклієнта допорта. В разітакого підключеннястворюєтьсяоб’єкт типуClientConnection, в якомуреалізованийпотік по опитуваннюсокета, до якогопідключенийклієнт, та обробкапротокольнихкоманд. КласServerє універсальнимі нічого незнає про повідомлення, якими обмінюютьсягравці (клієнти).В ньому реалізованелише приєднання/від’єднанняклієнтів, надсиланнястроки певномуклієнту тафункція broadcastяка, якзрозуміло зназви, надсилаєповідомленняусім зареєстрованимклієнтам.
КласClientConnection:
importjava.net.*;
importjava.io.*;
importjava.util.*;
classClientConnection implements Runnable {
privateSocket sock;
privateDataInputStream in;
privateOutputStream out;
privateString host;
privateServer server;
privatestatic final int bufsize = 8192;
privatebyte buffer[] = new byte[bufsize];
privatestatic final String CRLF = "\r\n";
privateString name = null;
privateString id;
privateboolean busy = false;
publicClientConnection(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);
newThread(this).start();
}catch (IOException e) {
System.out.println(«failedClientConnection » + e);
}
}
publicString toString() {
returnid + " " + host + " " + name;
}
publicString getHost() {
returnhost;
}
publicString getId() {
returnid;
}
publicboolean isBusy() {
returnbusy;
}
publicvoid setBusy(boolean b) {
busy= b;
}
publicvoid close() {
server.kill(this);
try{
sock.close(); // closes in and out too.
}catch (IOException e) {
}
}
publicvoid write(String s) {
bytebuf[] = new byte[s.length()];
s.getBytes(0,buf.length, buf, 0);
try{
out.write(buf,0, buf.length);
}catch (IOException e) {
close();
}
}
privateString readline() {
try{
returnin.readLine();
}catch (IOException e) {
returnnull;
}
}
staticprivate final int NAME = 1;
staticprivate final int QUIT = 2;
staticprivate final int TO = 3;
staticprivate final int DELETE = 4;
staticprivate Hashtable keys = new Hashtable();
staticprivate String keystrings[] = {
"",«name», «quit», «to», «delete»
};
static{
for(int i = 0; i
keys.put(keystrings[i], newInteger(i));
}
privateint lookup(String s) {
Integeri = (Integer) keys.get(s);
returni == null? -1: i.intValue();
}
publicvoid run() {
Strings;
StringTokenizerst;
out:
while((s = readline()) != null) {
st= new StringTokenizer(s);
Stringkeyword = st.nextToken();
switch(lookup(keyword)) {
default:
System.out.println(«boguskeyword: » + keyword + "\r");
break;
caseNAME:
name= st.nextToken() +
(st.hasMoreTokens()? " "+ st.nextToken(CRLF): "");
System.out.println("["+ new Date() + "] " + this + "\r");
server.set(id,this);
break;
caseQUIT:
breakout;
caseTO:
Stringdest = st.nextToken();
Stringbody = st.nextToken(CRLF);
server.sendto(dest, body);
break;
caseDELETE:
busy= true;
server.delete(id);
break;
}
}
close();
}
}
Клас ClientConnectionреалізуєобмін інформацієюз конкретнимклієнтом. Вньому зберігаєтьсяоб’єкт класуSocket, до якого приєднанийцей клієнт, тастворюєтьсяпотік, в якомуздійснюєтьсяперіодичнаспроба читатиз сокета. Якщоця спробазавершуєтьсяуспіхом, тобтонадійшло повідомленнявід клієнта, це повідомленняаналізуєтьсяі здійснюєтьсявідповіднареакція. Дляздіснення цієїреакції викликаютьсяметоди класуServer, об’єкт якогопередаєтьсякласу ClientConnectionв якостіпараметраконструктора.Крім того вцьому класіє метод, якийздійснює безпосереднєнадсиланняінформаціїдо клієнта.Коли серверупотрібно надіслатиінформаціюконкретномуклієнтові, вінвикликає цейметод.
клас Client:
importjava.util.*;
importjava.io.*;
importjava.net.*;
importjava.awt.*;
importjava.applet.*;
publicclass Client extends Applet {
privateServerConnection server;
privateString serverName;
privateboolean single = false;
privateboolean seen_pass = false;
privateboolean name_set = false;
privateString name;
privateString others_name;
privatePanel topPanel;
privateLabel prompt;
privateTextField namefield;
privateButton done;
privateTextField chatfield;
privateList idList;
privateTextArea dialogArea;
publicvoid init() {
setLayout(new BorderLayout() );
serverName= getCodeBase().getHost();
if(serverName.equals(""))
serverName= «localhost»;
prompt= new Label(«Enter id:»);
namefield= new TextField(30);
topPanel= new Panel();
topPanel.setBackground(newColor(255, 255, 200));
topPanel.add(prompt);
topPanel.add(namefield);
add(«North»,topPanel);
idList= new List(10, false);
add(«West»,idList );
dialogArea= new TextArea();
dialogArea.setEditable( false );
add(«Center»,dialogArea );
}
publicvoid start() {
try{
showStatus(«Connecting to „+ serverName);
server= new ServerConnection(this,serverName);
server.start();
showStatus(“Connected: „+ serverName);
}catch (Exception e) {
single= true;
}
}
publicvoid stop() {
if(!single)
server.quit();
}
voidadd(String id, String hostname, String name) {
delete(id);// in case it is already there.
idList.addItem(“(»+ id + ") " + name + "@" + hostname);
}
voiddelete(String id) {
for(int i = 0; i
Strings = idList.getItem(i);
s= s.substring(s.indexOf("(") + 1, s.indexOf(")"));
if(s.equals(id)) {
idList.delItem(i);
break;
}
}
if(idList.countItems() == 0)
showStatus(«Waitfor other players to arrive.»);
}
privateString getName(String id) {
for(int i = 0; i
Strings = idList.getItem(i);
Stringid1 = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
if(id1.equals(id)) {
returns.substring(s.indexOf(" ") + 3, s.indexOf("@"));
}
}
returnnull;
}
voidchat(String id, String s) {
dialogArea.appendText(id + ":" + s+ "\n");//append
showStatus(id+ ": " + s);
}
voidquit(String id) {
showStatus(id+ " just quit.");
delete(id);
}
privatevoid nameEntered(String s) {
if(s.equals(""))
return;
System.out.println(s);
name= s;
if(!single )
{
server.setName(name);
showStatus(«Wait for otherplayers to arrive.»);
}
prompt.setText(«Yousay:»);
name_set= true;
}
publicboolean action(Event evt, Object arg) {
System.out.println(«a»);
if(evt.id== Event.ACTION_EVENT)
if(evt.target == namefield){
if(name_set ){
dialogArea.appendText(name + ":" + namefield.getText()+"\n");
if(!single)
server.sendTo((String)arg,idList.getSelectedItem());
}
elsenameEntered((String)arg);
namefield.setText("");
}
returntrue;
}
}
Цей класє розширеннямкласу Applet, отже є аплетом.В цьому класістворюєтьсяоб’єкт класуServerConnection, через якійздійснюєтьсяобмін інформацієюз сервером.Графічнийінтерфейс цьогокласу представляє3 області: полевводу, в якеспочатку вводитьсяім’я користувача, а потім — повідомлення, адресованііншим клієнтам, список клієнтів, в якому требаобирати адресата, та текстоваобласть в якійвідбиваєтьсятекст діалога.Метод actionреалізуєобробку подіївводу текстув область вводу.Методи add,delete, chat, nameEntered, quit єреакцією нанаступні події: підключеннянового клієнта, зникненняклієнта, надходженняповідомленнявід клієнта,ідентифікаціята вихід. Ціметоди визиваютьсякласом ServerConnectionпри надходженнівідповіднихповідомлень, або ж всерединіаплета, якщоджерелом подіїє сам клієнт.
класServerConnection:
importjava.io.*;
importjava.net.*;
importjava.util.*;
classServerConnection implements Runnable {
voidsendTo(String s, String id)
{
if(id!= null )
out.println(«to»+id+" "+s);
}
privatestatic final int port = 6564;
privatestatic final String CRLF = "\r\n";
privateDataInputStream in;
privatePrintStream out;
privateString id, toid = null;
privateClient client;
publicServerConnection(Scrabblet sc, String site) throws IOException {
Socket server = new Socket(site, port);
in = new DataInputStream(server.getInputStream());
out = new PrintStream(server.getOutputStream(), true);
}
publicServerConnection( Client c,String site) throws IOException {
client= c;
Socket server = new Socket(site, port);
in = new DataInputStream(server.getInputStream());
out = new PrintStream(server.getOutputStream(), true);
}
privateString readline() {
try{
returnin.readLine();
}catch (IOException e) {
returnnull;
}
}
voidsetName(String s) {
out.println(«name» + s);
}
voiddelete() {
out.println(«delete» + id);
}
voidsetTo(String to) {
toid= to;
}
voidsend(String s) {
if(toid != null)
out.println(«to» + toid + " " + s);
}
voidchat(String s) {
send(«chat» + id + " " + s);
}
voidquit() {
send(«quit» + id); // tell other player
out.println(«quit»);
stop();
}
privateThread t;
voidstart() {
t= new Thread(this);
t.start();
}
voidstop() {
t.stop();
}
privatestatic final int ID = 1;
privatestatic final int ADD = 2;
privatestatic final int DELETE = 3;
privatestatic final int CHAT = 4;
privatestatic final int QUIT = 5;
privatestatic Hashtable keys = new Hashtable();
privatestatic String keystrings[] = {
"",«id», «add», «delete»,«chat»,
«quit»
};
static{
for(int i = 0; i
keys.put(keystrings[i], newInteger(i));
}
privateint lookup(String s) {
Integeri = (Integer) keys.get(s);
returni == null? -1: i.intValue();
}
publicvoid run() {
Strings;
StringTokenizerst;
while((s = readline()) != null) {
st= new StringTokenizer(s);
Stringkeyword = st.nextToken();
switch(lookup(keyword)) {
default:
System.out.println(«boguskeyword: » + keyword + "\r");
break;
caseID:
id= st.nextToken();
break;
caseADD: {
Stringid = st.nextToken();
Stringhostname = st.nextToken();
Stringname = st.nextToken(CRLF);
client.add(id, hostname, name);
}
break;
caseCHAT: {
Stringfrom = st.nextToken();
client.chat(from,st.nextToken(CRLF));
}
break;
caseQUIT: {
Stringfrom = st.nextToken();
client.quit(from);
}
break;
}
}
}
}
Цей класє дзеркальнимвідображеннямкласу ClientConnection.Але він більштісно переплетенийз класом Client.В ньому реалізованийпотік, якийопитує сокет, через якийклієнт під’єднанодо сервера, здійснює аналізнадходячихповідомленьта викликаєпотрібні методикласу Client.Крім того вньому є методи, які викликаютьсякласом Clientдля відсиланняінформаціїна сервер.
Ця програмалегко може бутимодифікованав напрямкурозширеннякількостіпротокольнихкоманд та ускладненняклієнта зарахунок додаванняспецифічнихреакцій на новікоманди. В класіClientConnectionможе бутиускладненареакція напід’єднанняклієнта. Наприклад, клієнту можевидаватисяінформаціяпро початковіумови гри. Такимчином наведенапрограма можеслужити скелетомдля створеннябільш складних.Можна дещоурізати класиClientтаServerConnection, залишившив них лише базовіфункції з тим, щоб потім розширюватиїх шляхом механізмуоб’єктногоуспадкування.
Резюме.
Таким чиномJavaтехнологіяє дуже перспективноюдля застоскванняв розробкахнеокомерційногоспрямування.ОбмеженістьінструментаріюJavaне проявляєтьсяв проектахневеликогообсягу і з лихвоюкомпенсуєтьсяпростотоюпрограмуваннярозподіленихпрограм, якіпрацюють змережею Internet/Intranet. ПереносимістьJavaпрограм спрощуєобмін навчальнимипрограмамиміж різниминавчальнимизакладими, відкрииваєможливістьсумісних розробокта створеннястандартнихнавчальнихпрограм, наприкладдля шкіл. Крімтого, дужепривабливоюз точки зоруефективності, залишаєтьсяідея втіленняв навчальнихзакладах мережевихкомп’ютерів(NetworkComputers), якіпрацюють набазі Java, замістьзвичних персональнихкомп’ютерів(PersonalComputers). На останокможна згадатипро те що Javaдобре підтримуєнаціональніабетки, оскількирозробляласядля інтернаціональноїмережі Internet.Ця обставинатеж є важливоюрисою в умовахУкраїни.
Джерелаінформації:
www.sun.com/ Специфікація мови програмування Java.
Нотон Патрик, Шилдт Герберт. Полный справочник по Java.: Пер. с англ.: — К.: Диалектика, 1997.
Страуструп Бьярн. Язык программирования С++.: Пер. с англ.: — К.: ДиаСофт, 1993.
Магические зерна Sun. COMPUTER WORLD Киев, №29-30 (19 августа 1998) с.10.
Цінина програмніпродукти. ( ПоматеріаламHot-line).