Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€ для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор Майкл ΠœΠΎΡ€Ρ€ΠΈΡΠΎΠ½

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) {

// ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС //Если соСдинСниС Π½Π΅ установлСно, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ клиСнтскоС сообщСниС ΠΎΠ± установлСнии соСдинСния сСрвСру

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().

Листинг 14.6. ΠœΠ΅Ρ‚ΠΎΠ΄ update() класса LHCanvas отправляСт сообщСния, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Π·Π±ΡƒΠΊΠΎΠΉ ΠœΠΎΡ€Π·Π΅, Π² соотвСтствии с Π½Π°ΠΆΠ°Ρ‚Ρ‹ΠΌΠΈ клавишами

private void update() {

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°

int keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0) {

if (isServer) //ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½

server.sendMessage("Dot");

else

client.sendMessage("Dot");

status = "Dot";

}

else if ((keyState & RIGHT_PRESSED) != 0) {

if (isServer) //ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΡ€Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½

server.sendMessage("Dash");

else

client.sendMessage("Dash");

status = "Dash";

}

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠœΠΎΡ€Π·Π΅

if (mode != 0) {

morseTimer++;

// Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ

if (mode == 1 && morseTimer > 3)

mode = 0;

// Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ Ρ‚ΠΈΡ€Π΅

else if (mode == 2 && morseTimer > 9)

mode = 0;

}

}

ΠœΠ΅Ρ‚ΠΎΠ΄ update() провСряСт Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиш ΠΈ Π² соотвСтствии с Π½Π°ΠΆΠ°Ρ‚Ρ‹ΠΌΠΈ клавишами отправляСт Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ. Клавиша Π²Π»Π΅Π²ΠΎ соотвСтствуСт Ρ‚ΠΎΡ‡ΠΊΠ΅, Π° клавиша Π²ΠΏΡ€Π°Π²ΠΎ – Ρ‚ΠΈΡ€Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π°Π·Π±ΡƒΠΊΠΈ ΠœΠΎΡ€Π·Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ update() просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ sendMessage() сСтСвого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ сСрвСра).

ПослС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ клавиш ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ update() обновляСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠœΠΎΡ€Π·Π΅. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode Ρ€Π°Π²Π½ΠΎ 1, Ρ‚ΠΎ выводится Ρ‚ΠΎΡ‡ΠΊΠ°, Π·Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° увСличиваСтся Π΄ΠΎ 3, послС Ρ‡Π΅Π³ΠΎ выводится ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка с ΠΏΠΎΠ³Π°ΡˆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ³Π½Π΅ΠΌ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode Ρ€Π°Π²Π½ΠΎ 2, выводится Ρ‚ΠΈΡ€Π΅, ΠΏΡ€ΠΈ этом счСтчик Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ 9. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ слСдуСт вывСсти ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка с ΠΏΠΎΠ³Π°ΡˆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ³Π½Π΅ΠΌ, Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π΅ измСняСтся.

ΠœΠ΅Ρ‚ΠΎΠ΄ draw() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка Π½Π° экран (листинг 14.7).

Листинг 14.7. ΠœΠ΅Ρ‚ΠΎΠ΄ draw() класса LHCanvas Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка

private void draw(Graphics g) {

// вывСсти Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

if (mode == 0) //Π’ зависимости ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌΠ° маяк свСтится ΠΈΠ»ΠΈ Π½Π΅Ρ‚

g.drawImage(background[0], 0, 0, Graphics.TOP | Graphics.LEFT);

else

g.drawImage(background[1], 0, 0, Graphics.TOP | Graphics.LEFT);

// вывСсти сообщСниС ΠΎ статусС

g.setColor(255, 255, 255); // white

g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_MEDIUM));

g.drawString(status, getWidth() / 2, 5, Graphics.TOP | Graphics.HCENTER); // Π’ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части экрана выводится статусноС сообщСниС

// вывСсти содСрТимоС Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° экран

flushGraphics();

}

ΠœΠ΅Ρ‚ΠΎΠ΄ draw() начинаСтся с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode, которая опрСдСляСт, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка слСдуСт вывСсти. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ выводится ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка с ΠΏΠΎΠ³Π°ΡˆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ³Π½Π΅ΠΌ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС выводится ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ маяка с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ³Π½Π΅ΠΌ. ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части экрана сообщСниС ΠΎ статусС соСдинСния. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ статусС выводится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ setStatus():

public void setStatus(String s) {

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус

status = s;

}

ПослСдний ΠΌΠ΅Ρ‚ΠΎΠ΄ класса LHCanvas – это ΠΌΠ΅Ρ‚ΠΎΠ΄ receiveMessage(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ сообщСниС, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π°Π·Π±ΡƒΠΊΠΎΠΉ ΠœΠΎΡ€Π·Π΅, ΠΈ Π² соотвСтствии с сообщСниСм настраиваСт холст. Π’ листингС 14.8 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: Листинг 14.8. ΠœΠ΅Ρ‚ΠΎΠ΄ receiveMessage() класса LHCanvas ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎ сСти

public void receiveMessage(String message) {