• 沒有找到結果。

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 便能順利的 收發訊息封包。

相關文件