Реферат: Yava технологія.Основні риси та персрективи застосування
};
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 + " ");
break;
case NAME:
name = st.nextToken() +
(st.hasMoreTokens() ? " " + st.nextToken(CRLF) : "");
System.out.println("[" + new Date() + "] " + this + " ");
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+ " ");//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()+" ");
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 = " ";
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();