2007年1月25日 星期四

設計connection時的問題

設計player connection時,每個connection都是包裹在shell裡面的,所有想要對player輸出的訊息或讀取輸入資料,都要透過shell,以shell連絡connection來達成,因此整個Mud就不會看見connection這種資料,而是存取shell這個封裝格式。

因此,對shell就有幾個地方要注意


  1. Shell的輸入輸出過程中有可能因為連線中斷而造成IOException。
  2. Shell的輸入輸出有可能被其他shell搶奪,例如shell a對shell b 輸出訊息時,shell c有可能半路攔截shell a的執行,並對shell b輸出訊息,因此造成player b 在螢幕前面看到互相交雜的輸出結果。
  3. Shell在執行完之後因為其他地方意外保留著Shell的reference而造成memory leak。

解決上述問題的方法是:

  1. 不管它,因為輸出過程中的連線中斷是常態,所以只要在try/catch時將IOException抓住並且留下log即可,我們唯一要注意的是:異常斷線不能造成Mud或Telnet系統當機,或者Thread佔用。
  2. 對Shell的輸出method設定synchronized,而輸入介面不需要,因為輸入介面只有使用者本人能使用,因此若將輸入介面設定synchronized,則會造成鎖死現象。
  3. 小心操縱Shell的取用,不能輕易讓其他物件取得Shell的reference,因此在設計MudObject時並沒有getShell的method,只有在setShell時可以為object設定新使用者(shell),且藉由回傳值取得此object的上一個使用者。另一個可以儲存shell的地方是MudSpace,以達到快速廣播的效果,但是其他Class也沒辦法藉由MudSpace存取Shell。若是其他Class有存取Shell的需要,標準程序是藉由MudObject來執行間接存取。

以上,目前只剩下異常斷線時,系統穩定性的問題。

沒有留言: