Пример за аплет, който комуникира със сървъра
Ще дадем един пример, който илюстрира как можем да реализираме аплет, който асинхронно получава данни от сървъра. Да си представим, че искаме да направим сайт, от който да се следят цените на акциите на големи компании на борсата. Цената на акциите на борсата е нещо, което много бързо се променя (всяка секунда или дори по-често). Искаме постоянно да визуализираме актуалната в момента цена за дадена компания.
Да предположим, че имаме TCP сървър, който приема идентификатор на компания (company ticker), след което започва постоянно да изпраща информация за цената на акциите на тази компания при всяка нейна промяна. Искаме да направим аплет, който отваря един TCP сокет, изпраща по него към сървъра идентификатор на компания и след това постоянно отпечатва всичко, което прочете от сокета. Една примерна реализация може да изглежда по следния начин:
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| //StockQuoteApplet.java
import java.applet.Applet;
import java.awt.*;
import java.net.Socket;
import java.io.*;
public class StockQuoteApplet extends Applet
implements Runnable {
public static final int STOCK_SERVER_PORT = 2004;
public static final String COMPANY_TICKER = "MSFT";
private BufferedReader mSocketReader;
private TextArea mTextArea = new TextArea();
public void init() {
try {
// Establish TCP socket connection with the server
String host = this.getCodeBase().getHost();
Socket sock = new Socket(host, STOCK_SERVER_PORT);
// Send the company ticker to the server
OutputStreamWriter socketWriter =
new OutputStreamWriter(sock.getOutputStream());
socketWriter.write(COMPANY_TICKER + "n");
socketWriter.flush();
// Get the input stream reader
mSocketReader = new BufferedReader(
new InputStreamReader(sock.getInputStream()));
} catch (IOException ioex) {
ioex.printStackTrace();
System.exit(-1);
}
// Set the layout manager to null
this.setLayout(null);
// Create the text area and add it to the applet
mTextArea.setBounds(new Rectangle(0, 0, 300, 150));
this.add(mTextArea);
// Create and start socket reader thread
Thread sockerReaderThread = new Thread(this);
sockerReaderThread.start();
}
public void run() {
try {
while (true) {
String line = mSocketReader.readLine();
mTextArea.append(line);
mTextArea.append("n");
}
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
} |