String hop1_addr="atp://localhost:50001";
// 定義各節點的位址.端口
我們自行定義的對話視窗類別物件的宣告:
MyDialog my_dialog = null;
當我們在 Aglet server 上按下 create 之後,Aglet 便會執 行所建立的class 內的 onCreation()方法來做一些初始化 的動作。在我們的程式碼內,當 create 之後 Aglet 程式會 於兩秒鐘之後傳送到hop1 去,並發出"hop1"的訊息。
程式碼如下:
public void onCreation(Object init) { setText("go to hop1 after 2
seconds...");
waitMessage(2000); // 等待2 秒鐘
itinerary = new SimpleItinerary(this);
try {
itinerary.go(hop1_addr, "hop1");
//送到 hop1 去
} catch (Exception ex) { ex.printStackTrace();
} }
在 Aglet 裡面預設了一個訊息處理程序,每當接收訊息的 時候,Aglet server 便會執行這個程序,並依照使用者定 義的方式來處理訊息。下面是我們定義的訊息處理方法:
public boolean handleMessage(Message msg) {
// 只有在 hop1 的時候才秀出對話視窗 if (msg.sameKind("hop1")) {
createGUI();
// Create GUI to control this Aglet printString();
return true;
}
當 Aglet 程式移動到 hop1 後,server 便會執行這個訊息 處理程序,然後判斷接收的訊息,如果接收的訊息符合 字串 “hop1",那麼 hop1 便會執行相對的副函式 createGUI()和 printString()。不只有在 Aglet 程式移動時 才會發出訊息,當使用者按下server 定義的按鈕時也會
protected void createGUI() {
my_dialog = new MyDialog();
public void printString() {
setText("Print string A...");
// 在 hop1 server 印出訊息
my_dialog.textArea.append(strA);
// 在對話視窗上印出字串 A
my_dialog.textArea.append("End of strA. 60k bytes printed.\n");
my_dialog.textArea.append("\n");
waitMessage(2000); // 等待兩秒鐘
setText("Print string B...");
// 在 hop1 server 印出訊息
my_dialog.textArea.append(strB);
// 在對話視窗上印出字串 B,附加在字串 A 的後面 my_dialog.textArea.append("End of strB. 40k bytes printed.\n");
}
dialog()副函式的程式碼:
public void dialog(Message msg) {
// check and create a dialog box
my_dialog.setVisible(true);
}
定義的視窗類別物件 MyDialog:
public class MyDialog extends Frame implements WindowListener, ActionListener {
/* 宣告使用者介面物件 */
private Button hide = new Button("HIDE");
// 隱藏視窗的按鈕
public TextArea textArea = new TextArea(15, 50); // 顯示字串的區域
/* Constructor,當視窗物件被建立時就開始產生對 話視窗的元件 */
MyDialog() {
layoutComponents();
addWindowListener(this);
hide.addActionListener(this);
}
/* 當我們按下對話視窗上的 HIDE 按鈕後,便將視窗隱 藏 */
public void actionPerformed(ActionEvent ae) {
if
("HIDE".equals(ae.getActionCommand())) { setVisible(false);
} }
/* 編排所有的視窗元件 */
private void layoutComponents() { // Layouts components
cns.fill = GridBagConstraints.BOTH;
grid.setConstraints(textArea, cns);
add(textArea);
// HIDE 按鈕
Panel p = new Panel();
cns.fill = GridBagConstraints.NONE;
cns.gridheight = 1;
grid.setConstraints(p, cns);
add(p);
p.setLayout(new FlowLayout());
p.add(hide);
}
/* 處理視窗事件 */
public void windowActivated(WindowEvent we) {}
public void windowClosed(WindowEvent we) {}
public void windowClosing(WindowEvent we) // 若我們按下對話視窗上的
{ dispose(); } //
關閉按鈕就刪除視窗物件
public void windowDeactivated(WindowEvent we) {}
public void windowDeiconified(WindowEvent we) {}
public void windowIconified(WindowEvent we) {}
public void windowOpened(WindowEvent we) {}
}
z 執行結果圖;
create 之後會顯示訊息,並於兩秒後移動到下一個節點
圖 31-實驗四 (1)
移動到下一個節點後馬上產生對話視窗,並顯示出字串 A
圖 32-實驗四 (2)
經過兩秒鐘之後,再顯示出字串 B,附加於字串 A 之後
圖 33-實驗四 (3)
z 遇到的困難與解決方式:
一開始在實驗的過程中,原本以為已經順利完成了,但是將程式 碼移動到另一台電腦測試時,卻發現Aglet 程式無法順利移動到其他 節點去,後來經過了多次的實驗,推測問題是起因於防毒軟體的防火 牆將Aglet 程式所使用的 port 阻擋掉,而造成 Aglet server 無法順利
送出與接收訓息。
我們的解決方式是在防毒軟體的設定上新增一些例外的port,讓 防毒軟體不檢測經過這些port 的封包,如此 Aglet server 便能順利的 收發訊息封包。