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