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) {
// попытаться отправить сообщение //Если соединение не установлено, отправить клиентское сообщение об установлении соединения серверу
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, он выводит на экран информацию о ходе подключения, а также отображает нужную картинку с маяком в соответствии с получаемой информацией.