if (!connected)
sendMessage("Client");
// попытаться принять пакет датаграммы
Datagram dg = dc.newDatagram(32);
dc.receive(dg);
// проверить, что датаграмма содержит данные
if (dg.getLength() > 0) {
String data = new String(dg.getData(), 0, dg.getLength());
if (data.equals("Server")) { //Ответить на сообщение сервера о соединении
// оповестить пользователя об установлении соединения
canvas.setStatus("Connected to peer server.");
connected = true;
}
else {
// отправить данные
canvas.receiveMessage(data); //Сообщение содержит символы азбуки Морзе, поэтому его следует передать холсту
}
}
}
}
catch (ConnectionNotFoundException cnfe) {
System.err.println("The network server is unavailable.");
}
catch (IOException ioe) {
}
}
Метод run() класса клиента очень похож на аналогичный метод класса сервера за исключением того, что в классе клиента отсутствует переменная адреса при отправлении датаграммы. Кроме того, URL немного отличается от того, который использовался в классе сервера. И снова важно отметить, что номер порта (5555) должен быть одинаковым для клиента и сервера.
Класс LHClient также реализует метод sendMessage(), который также очень похож на аналогичный метод сервера. В листинге 14.4 приведен код метода sendMessage() клиента.
Листинг 14.4. Метод sendMessage() класса LHClient отправляет строковое сообщение серверу как пакет датаграммы
public void sendMessage(String message) {
// отправить сообщение
try {
// преобразовать строку в массив байтов
byte[] bytes = message.getBytes();
// отправить сообщение
Datagram dg = null; //Упаковка данных в датаграмму и отправка клиенту
dg = dc.newDatagram(bytes, bytes.length);
dc.send(dg);
}
catch (Exception e) {
}
}
Единственное отличие методов sendMessage() сервера и клиента – это то, что версия класса клиента не использует адреса при отправлении пакета серверу. Это незначительное, но очень важное отличие. Холст мидлета Lighthouse Когда классы сервера и клиента созданы, перейдем к созданию холста класса Lighthouse. Класс называется LHCanvas, он выводит на экран информацию о ходе подключения, а также отображает нужную картинку с маяком в соответствии с получаемой информацией.
private Display display;
private boolean sleeping;
private long frameDelay;
private Image[] background = new Image[2]; //Эта переменная говорит о том, является данное приложение образом сервера или клиента
private LHClient client;
private LHServer server;
private boolean isServer;
private String status = "";
private int mode; // 0 = none, 1 = dot, 2 = dash
private int morseTimer;
Переменная background содержит два изображения маяка: с включенным и погашенным огнем. Переменные server и client – это объекты сервера и клиента соответственно, они отвечают за работу мидлета с сетью. Переменная isServer очень важна, она определяет сетевой режим работы мидлета. Эта переменная определяет, как работает мидлет – как клиент или как сервер.
Текст статуса хранится в переменной status. временная mode используется для контроля вывода изображений маяка, а также интервалов времени. Помните, что точка в азбуке Морзе по длительности в три раза меньше тире, поэтому в мидлете Lighthouse используется таймер вывода изображения маяка, который задерживает изображение с включенным огнем в соответствии с отображаемым сигналом. За задержку отвечают переменные mode и morseTimer.
Переменные холста широко используются в методе start(), код которого приведен в листинге 14.5.
Листинг 14.5. Метод start() класса LHCanvas запускает сервис Клиент-Сервер
public void start() {
// установить экран как холст
display.setCurrent(this);
// инициализация фонового изображения
try {
background[0] = Image.createImage("/LighthouseOff.png");
background[1] = Image.createImage("/LighthouseOn.png");
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
// инициализация режима и таймера
mode = 0;
morseTimer = 0;
// запуск сетевого сервиса
if (isServer) { //Начиная с этой точки, мидлет работает в режиме сервера или клиента
server = new LHServer(this);
server.start();
}
else {
client = new LHClient(this);
client.start();
}
// начало потока анимации
sleeping = false;
Thread t = new Thread(this);
t.start();
}
После того как фоновые изображения инициализированы, метод start() инициализирует таймер и режим. Переменная mode инициализируется 0, что соответствует погашенному огню маяка (нет сообщения), в то время как переменная morseTimer обнуляется, несмотря на то что она не используется в отсутствие сообщения.
Наиболее важная часть кода метода start() реализует режим сервера или клиента. В зависимости от значения переменной isServer создается экземпляр класса LHServer или LHClient. После этого создается сетевой объект, вызывается метод старт, запускающий поток соединения.
Метод start() инициализирует мидлет Lighthouse, а метод update() обрабатывает пользовательский ввод и позволяет вам отправлять сообщения, закодированные азбукой Морзе. В листинге 14.6 приведен код метода update().
Читать дальше
Конец ознакомительного отрывка
Купить книгу