скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Java технологія и основні риси та перспективи застосування

Клас 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"

  };

  static {

    for (int i = 0; i < keystrings.length; i++)

      keys.put(keystrings[i], new Integer(i));

  }

  private int lookup(String s) {

    Integer i = (Integer) keys.get(s);

    return i == null ? -1 : i.intValue();

  }

  public void run() {

    String s;

    StringTokenizer st;

out:

    while ((s = readline()) != null) {

      st = new StringTokenizer(s);

      String keyword = st.nextToken();

      switch (lookup(keyword)) {

      default:

        System.out.println("bogus keyword: " + keyword + "\r");

        break;

      case NAME:

        name = st.nextToken() +

          (st.hasMoreTokens() ? " " + st.nextToken(CRLF) : "");

        System.out.println("[" + new Date() + "] " + this + "\r");

        server.set(id, this);

        break;

      case QUIT:

        break out;

      case TO:

        String dest = st.nextToken();

        String body = st.nextToken(CRLF);

        server.sendto(dest, body);

        break;

      case DELETE:

        busy = true;

        server.delete(id);

        break;

      }

    }

    close();

  }

}

Клас ClientConnection реалізує обмін інформацією з конкретним клієнтом. В ньому зберігається об’єкт класу Socket, до якого приєднаний цей клієнт, та створюється потік, в якому здійснюється періодична спроба читати з сокета. Якщо ця спроба завершується успіхом, тобто надійшло повідомлення від клієнта, це повідомлення аналізується і здійснюється відповідна реакція. Для здіснення цієї реакції викликаються методи класу Server, об’єкт якого передається класу ClientConnection в якості параметра конструктора. Крім того в цьому класі є метод, який здійснює безпосереднє надсилання інформації до клієнта. Коли серверу потрібно надіслати інформацію конкретному клієнтові, він викликає цей метод.

клас Client:

import java.util.*;

import java.io.*;

import java.net.*;

import java.awt.*;

import java.applet.*;

public class Client extends Applet {

  private ServerConnection server;

  private String serverName;

  private boolean single = false;

  private boolean seen_pass = false;

  private boolean name_set = false;

  private String name;

  private String others_name;

  private Panel topPanel;

  private Label prompt;

  private TextField namefield;

  private Button done;

  private TextField chatfield;

  private List idList;

  private TextArea dialogArea;

  public void 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(new Color(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 );

  }

  public void start() {

    try {

      showStatus("Connecting to " + serverName);

      server = new ServerConnection(this,serverName);

      server.start();

      showStatus("Connected: " + serverName);

    } catch (Exception e) {

      single = true;

    }

  }

  public void stop() {

    if (!single)

      server.quit();

  }

  void add(String id, String hostname, String name) {

    delete(id); // in case it is already there.

    idList.addItem("(" + id + ")  " + name + "@" + hostname);   

  }

  void delete(String id) {

    for (int i = 0; i < idList.countItems(); i++) {

      String s = idList.getItem(i);

      s = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

      if (s.equals(id)) {

        idList.delItem(i);

        break;

      }

    }

    if (idList.countItems() == 0)

      showStatus("Wait for other players to arrive.");

  }

  private String getName(String id) {

    for (int i = 0; i < idList.countItems(); i++) {

      String s = idList.getItem(i);

      String id1 = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

      if (id1.equals(id)) {

        return s.substring(s.indexOf(" ") + 3, s.indexOf("@"));

      }

    }

    return null;

  }

  void chat(String id, String s) {

    dialogArea.appendText(id + ": " + s+ "\n");//append

    showStatus(id + ": " + s);

  }

  void quit(String id) {

    showStatus(id + " just quit.");

    delete(id);

  }

  private void nameEntered(String s) {

    if (s.equals(""))

      return;

    System.out.println(s);

    name = s;

    if( !single )

    {

        server.setName(name);

        showStatus("Wait for other players to arrive.");

    }

    prompt.setText("You say:");

    name_set = true;

  }

  public boolean 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());

      }

      else nameEntered((String)arg);

      namefield.setText("");

   }

    return true;

  }

}

Цей клас є розширенням класу Applet, отже є аплетом. В цьому класі створюється об’єкт класу ServerConnection, через якій здійснюється обмін інформацією з сервером. Графічний інтерфейс цього класу представляє 3 області: поле вводу, в яке спочатку вводиться ім’я користувача, а потім - повідомлення, адресовані іншим клієнтам, список клієнтів, в якому  треба обирати адресата, та текстова область в якій відбивається текст діалога. Метод action реалізує обробку події вводу тексту в область вводу. Методи add, delete, chat, nameEntered, quit є реакцією на наступні події: підключення нового клієнта, зникнення клієнта, надходження повідомлення від клієнта, ідентифікація та вихід. Ці методи визиваються класом ServerConnection при надходженні відповідних повідомлень, або ж всередині аплета, якщо джерелом події є сам клієнт.

клас ServerConnection:

import java.io.*;

import java.net.*;

import java.util.*;

class ServerConnection implements Runnable {

    void sendTo(String s, String id)

    {

        if( id!= null )

        out.println("to "+id+" "+s);

    }

  private static final int port = 6564;

  private static final String CRLF = "\r\n";

  private DataInputStream in;

  private PrintStream out;

  private String id, toid = null;

  private Client client;

  public ServerConnection(Scrabblet sc, String site) throws IOException {

              Socket server = new Socket(site, port);

              in = new DataInputStream(server.getInputStream());

              out = new PrintStream(server.getOutputStream(), true);

  }

public ServerConnection( 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);

  }

  private String readline() {

    try {

      return in.readLine();

    } catch (IOException e) {

      return null;

    }

  }

  void setName(String s) {

    out.println("name " + s);

  }

  void delete() {

    out.println("delete " + id);

  }

  void setTo(String to) {

    toid = to;

  }

  void send(String s) {

    if (toid != null)

      out.println("to " + toid + " " + s);

  }

  void chat(String s) {

    send("chat " + id + " " + s);

  }

void quit() {

    send("quit " + id);  // tell other player

    out.println("quit");

    stop();

  }

  private Thread t;

  void start() {

    t = new Thread(this);

    t.start();

  }

  void stop() {

    t.stop();

  }

  private static final int ID = 1;

  private static final int ADD = 2;

  private static final int DELETE = 3;

  private static final int CHAT = 4;

  private static final int QUIT = 5;

  private static Hashtable keys = new Hashtable();

  private static String keystrings[] = {

    "", "id", "add", "delete","chat",

    "quit"

  };

  static {

    for (int i = 0; i < keystrings.length; i++)

      keys.put(keystrings[i], new Integer(i));

  }

  private int lookup(String s) {

    Integer i = (Integer) keys.get(s);

    return i == null ? -1 : i.intValue();

  }

  public void run() {

    String s;

    StringTokenizer st;

    while ((s = readline()) != null) {

      st = new StringTokenizer(s);

      String keyword = st.nextToken();

      switch (lookup(keyword)) {

      default:

        System.out.println("bogus keyword: " + keyword + "\r");

        break;

      case ID:

        id = st.nextToken();

        break;

      case ADD: {

          String id = st.nextToken();

          String hostname = st.nextToken();

          String name = st.nextToken(CRLF);

          client.add(id, hostname, name);

        }

        break;

      case CHAT: {

          String from = st.nextToken();

          client.chat(from, st.nextToken(CRLF));

        }

        break;

      case QUIT: {

          String from = st.nextToken();

          client.quit(from);

        }

        break;

      }

    }

  }

}

Цей клас є дзеркальним відображенням класу ClientConnection. Але він більш тісно переплетений з класом Client. В ньому реалізований потік, який опитує сокет, через який клієнт під’єднано до сервера, здійснює аналіз надходячих повідомлень та викликає потрібні методи класу Client. Крім того в ньому є методи, які викликаються класом Client для відсилання інформації на сервер.

            Ця програма легко може бути модифікована в напрямку розширення кількості протокольних команд та ускладнення клієнта за рахунок додавання специфічних реакцій на нові команди. В класі ClientConnection може бути ускладнена реакція на під’єднання клієнта. Наприклад, клієнту може видаватися інформація про початкові умови гри. Таким чином наведена програма може служити скелетом для створення більш складних. Можна дещо урізати класи Client та ServerConnection, залишивши в них лише базові функції з тим, щоб потім розширювати їх шляхом механізму об’єктного успадкування.

Резюме.

            Таким чином Java технологія є дуже перспективною для застосквання в  розробках неокомерційного спрямування. Обмеженість інструментарію Java не проявляється в проектах невеликого обсягу і з лихвою компенсується простотою програмування розподілених програм, які працюють з мережею Internet/Intranet . Переносимість Java програм спрощує обмін навчальними програмами між різними навчальними закладими, відкрииває можливість сумісних розробок та створення стандартних навчальних програм, наприклад для шкіл. Крім того, дуже привабливою з точки зору ефективності, залишається ідея втілення в навчальних закладах мережевих комп’ютерів (Network Computers), які працюють на базі Java,  замість звичних персональних комп’ютерів (Personal Computers). На останок можна згадати про те що Java добре підтримує національні абетки, оскільки розроблялася для інтернаціональної мережі Internet. Ця обставина теж є важливою рисою в умовах України.


Джерела інформації:

1.   http://www.sun.com/ Специфікація мови програмування Java.

2.   Нотон Патрик, Шилдт Герберт. Полный справочник по Java.: Пер. с англ.: - К.: Диалектика, 1997.

3.   Страуструп Бьярн. Язык программирования С++.: Пер. с англ.: - К.: ДиаСофт, 1993.

4.   Магические зерна Sun. COMPUTER WORLD Киев, №29-30 (19 августа 1998) с.10.

5.   Ціни на програмні продукти. ( По матеріалам Hot-line).


Страницы: 1, 2


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.