ExchangeRateTable chạy trên máy khách, nó chịu trách nhiệm mỗi giây gửi yêu cầu đến máy chủ để cập nhật thơng tin về tỉ giá của thị trường chứng khốn. Để đạt được mục tiêu này chương trình của ta phải xây dựng 3 lớp:
• Lớp ExchangeRateTable
Là lớp chương trình dùng tạo một cửa sổ trình bày tỷ giá của các thị trường chứng khốn trong một vùng căn bản TextArea.
• Lớp ExchangeThread
Đây là một phân tuyến chạy song song với chương trình chịu trách nhiệm mỗi giây sẽ
gửi yêu cầu đến máy chủ và lấy số liệu về cập nhật. • Lớp ExchangeData
Là lớp thực hiện kết nối với máy chủ, lớp này thực sự cài đặt phương thức getRates dùng để gửi yêu cầu và nhận dữ liệu trả về từ máy chủ.
Ví dụ 2.2: ExchangeRateTable.java
import java.io.*; import java.awt.*; import java.awt.event.*; import java.net.*;
public class ExchangeRateTable {
public static void main (String args[]) {
Frame myWindow = new Frame("Stock Exchange Application"); TextArea rateTable = new TextArea("Wait ...");
Label rateLabel = new Label("Exchange Rate Table"); rateTable.setBounds(new Rectangle(16,33,240,100)); rateLabel.setBounds(new Rectangle(16,6,158,21)); myWindow.setLayout(null); myWindow.add(rateTable, null); myWindow.add(rateLabel,null); myWindow.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent event){ System.exit(0);
} });
myWindow.setSize(new Dimension(300,150)); myWindow.show();
ExchangeThread exRate = new ExchangeThread(rateTable); exRate.start();
} }
class ExchangeThread extends Thread { TextArea rateTable;
ExchangeData rate = new ExchangeData(); public ExchangeThread(TextArea rateTable){ this.rateTable = rateTable;
}
public void run(){ while (true)
{
String data = rate.getRates(); rateTable.setText(data); delay(1000);
} }
private void delay(int miliSeconds){ try { this.sleep(miliSeconds); } catch (Exception e) { System.out.println("Sleep error!"); } } } class ExchangeData { DatagramSocket socket; InetAddress serverAddress; String localHost; int bufferLength = 256;
byte inBuffer[] = new byte[bufferLength]; byte outBuffer[]; DatagramPacket outDatagram; DatagramPacket inDatagram; public ExchangeData(){ try {
socket = new DatagramSocket();
serverAddress = InetAddress.getByName("my.testing.server"); } catch (Exception e) { System.out.println("Connect error!"); } }
public String getRates(){ String data="";
try {
outBuffer = new byte[bufferLength]; outBuffer = "rate".getBytes();
outDatagram = new DatagramPacket(outBuffer, outBuffer.length, serverAddress, 2345);
socket.send(outDatagram); socket.received(inDatagram);
InetAddress destAddress = inDatagram.getAddress(); String destHost = destAddress.getHostName().trim(); int destPort = inDatagram.getPort();
data = new String(inDatagram.getData()); data = data.trim();
}
catch (IOException ex) { System.out.println("IOException occurred."); } return data; } }
Biên dịch chương trình: javac ExchangeRateTable.java
Chạy chương trình trên tương tự khi khi chạy 2 chương trình EchoServer và EchoClient.