String data = new String(dg.getData(), 0, dg.getLength());
if (data.equals("Client")) { //В ответ на соединение клиента, изменяется значение переменной и отправляется ответ
// оповестить пользователя об удачном соединении
canvas.setStatus("Connected to peer client.");
connected = true;
// попробовать ответить на принятое сообщение
sendMessage("Server");
}
else {
// отправить данные
canvas.receiveMessage(data); //Сообщение должно содержать знаки азбуки Морзе, поэтому необходимо его передать холсту
}
}
}
}
catch (IOException ioe) {
System.err.println("The network port is already taken.");
}
catch (Exception e) {
}
}
Метод run() начинается с вызова метода setStatus() класса LHCanvas, который выводит в строку статуса холста «Waiting for peer client…» – режим ожидания клиента. Пользователь будет знать, что сервер ожидает подключения клиента. После того как статус выведен на холст, вызывается метод run(), создающий датаграммное соединение. Номер использования порта (5555) – произвольный, однако важно, что клиент и сервер используют один порт для соединения. Также важно указать, что создаваемое соединение – датаграммное.
После того как датаграммное соединение установлено, метод run() запускает бесконечный цикл, в котором выполняются попытки принятия пакетов от клиента. Сначала создается объект класса Datagram, а затем он используется как хранилище и приемник датаграмм. Адрес датаграммы сохраняется на тот случай, если серверу потребуется отправить ответ.
Если датаграмма содержит данные, то байты датаграммы преобразуются в строку. Затем проверяется, равна ли эта строка «Client», специальному сообщению, обозначающему соединение клиента с сервером. Если соединение прошло успешно, то статус изменяется и клиенту отправляется сообщение «Server», таким образом клиент уведомляется о том, что соединение установлено.
Датаграммный пакет содержит строку «Client» только в том случае, если соединение установлено впервые. Далее будут отправляться и приниматься пакеты, содержащие только слова «Dot» (точка) или «Dash» (тире), в зависимости от того, какое сообщение отправляется клиентом. Сообщение передается в класс LHCanvas, где оно обрабатывается методом receiveMessage(). Подробнее об этом вы узнаете чуть позже, когда познакомитесь с кодом холста мидлета Lighthouse.
Последний метод класса LHServer – это метод sendMessage(), приведенный в листинге 14.2. Этот метод отправляет сообщения клиенту.
Листинг 14.2. Метод sendMessage() класса LHServer отправляет строковое сообщение как пакет датаграммы
public void sendMessage(String message) {
// отправить сообщение
try {
// преобразовать текстовое сообщение в массив байтов
byte[] bytes = message.getBytes(); //Строковое сообщение должно быть преобразовано в массив байтов
// отправить сообщение
Datagram dg = null; //Упаковка данных в датаграмму и отправка клиенту
dg = dc.newDatagram(bytes, bytes.length, address);
dc.send(dg);
}
catch (Exception e) {
}
}
В этом коде строковое сообщение преобразуется в массив байтов, а затем отправляется клиенту как датаграммный пакет. Обратите внимание, что адрес, сохраненный ранее в методе run(), теперь используется при создании объекта Datagram отправляемого сообщения. Этот адрес необходим, чтобы отправить сообщение клиенту. Однако, как вы увидите позже, этот адрес не обязателен при отправке сообщения клиентом серверу. Другая часть сетевого кода мидлета Lighthouse – это класс LHClient, который очень похож на класс LHServer. Так же, как и LHServer, класс LHClient также реализует интерфейс Runnable:
public class LHClient implements Runnable {
Ниже приведен список членов класса LHClient.
private LHCanvas canvas;
private DatagramConnection dc;
private boolean connected;
Переменные класса должны быть вам знакомы, поскольку они точно такие же, как и в классе LHServer, за исключением отсутствия переменной address. Ниже приведен код конструктора класса LHClient, который выполняет инициализацию некоторых переменных:
public LHClient(LHCanvas c) {
canvas = c;
connected = false;
}
Метод start() класса LHClient точно такой же, как и аналогичный метод класса LHServer, поэтому давайте перейдем к методу run(). В листинге 14.3 приведен код метода run() класса LHClient. Листинг 14.3. Метод run() класса LHClient отвечает на сообщения, полученные от сервера
public void run() {
try {
// соединиться с серверным устройством
canvas.setStatus("Connecting to peer server..."); //Клиент отображает начальное соединение, что говорит о том, что он пытается соединиться с сервером
dc = null;
while (dc == null)
dc = (DatagramConnection)Connector.open("datagram://localhost:5555"); //Номер порта клиента должен совпадать с номером порта сервера
while (true) {
// попытаться отправить сообщение //Если соединение не установлено, отправить клиентское сообщение об установлении соединения серверу
Читать дальше
Конец ознакомительного отрывка
Купить книгу