用JAVA編制電子白板軟體

978107發表於2005-08-20
 用JAVA編制電子白板軟體


用JAVA編制電子白板軟體
 

----隨著 Internet的迅速發展,在Email、WWW、FTP等傳統的非實時應用日趨成熟的同時,廣大網路使用者對線上實時交流的需求不斷擴大,如網上會議、遠端教學、協同工作等。這方面的應用軟體也日益豐富起來。該類軟體主要分為兩類,一種是以目前BBS和主頁上的聊天室為代表的純文字型的交流工具;另一種就是本文要介紹的電子白板類交流工具。電子白板除了具備聊天室的全部功能外,更重要的是,它還引入了繪畫圖形交流功能,使網上交流的形象性和直觀性大大加強了,彌補了文字交流的不足。當分佈在Internet不同位置的使用者用白板進行交流時,一個人在自己的白板上繪製的圖形可以馬上在別人的白板上顯示出來,好象大家都在同一塊白板上繪畫,彼此間的距離感大大縮短了。

----目前具有電子白板功能的軟體有微軟的Netmeeting等。此類軟體在使用前需要用安裝盤安裝(Netmeeting是InternetExplorer4.0的選裝件),在設定完成後才能使用。相比而言,在主頁中用JAVAApplet實現白板功能就顯得優勢很大。因為它不需要傳統軟體的下載、安裝和設定的繁瑣步驟,只要用支援JAVA的瀏覽器連線到該Applet所在主頁,就可以使用白板。用於瀏覽器的普及性(大部分常用瀏覽器都支援JAVA,如InternetExploer3.0與NetscapeNavigator3.0及以上版本)使得這種電子白板的潛在客戶群是巨大的。此外,用JAVA編制電子白板軟體還有一個顯而易見的優勢,就是整個軟體(尤其是白板伺服器)無須重新修改編譯就可在NT、Unix、Linux等支援JAVA的平臺上執行。

----目前基於瀏覽器和JAVA的電子白板正處於起步階段,筆者尚未在網上看到該類軟體。由於工作需要,筆者自行開發了一套此類電子白板軟體。這裡想將開發中的一些經驗介紹給大家,以達到共同交流的目的。

工作原理

----電子白板有兩種實現模型,一種是無白板伺服器,因此僅支援兩個使用者直接連結;另一種是有白板伺服器,原則上不限制同時上線人數和交談室個數,具體實現上可視伺服器效能和需要而定。本文要介紹屬於後者。

----當使用者需用白板與他人交流時,需要先用瀏覽器連到Applet所在主頁,Applet執行後會連線到該白板伺服器,和伺服器建立TCP連線。每個使用者可以在自己的白板上(嵌在Applet畫面中)繪製圖形和輸入文字,Applet會將這些資訊通過已建立的網路連線發往白板伺服器,並不斷偵聽、接收來自白板伺服器的圖形和文字資訊,將其再現在使用者的白板中。白板伺服器的作用是不斷偵聽、接收來自各 Applet的資訊,並將其轉發給其他使用者。

----由於瀏覽器對JAVAApplet的限制,使得Applet只能訪問傳送該Applet的宿主主機,因此只能在該Applet所在主機上執行白板伺服器,使得Applet能建立和遠端白板伺服器的聯絡。

功能設計

----一個實用的電子白板系統應該具備以下基本功能:

  1. 使用者在瀏覽到白板主頁時,需登入後才能進行交流。這將提供交流時用的名字,必要時還可做許可權檢查。
  2. 使用者能夠根據交談室的交談主題選擇參加和退出現有的交談室,並且能建立新的交談室。可以根據該電子白板系統的應用領域和需要附加一些許可權設定。
  3. 使用者只能和在同一交談室中的使用者交流。一個交談室的資訊對於別的交談室是不可見的。
  4. 白板應至少具有一些如更換畫筆顏色、清除畫板(僅影響自己的白板)等方便使用者的功能。
  5. 白板應具有一個操作提示和操作資訊反饋欄,對使用者顯示一些操作提示和操作結果資訊,這樣可以方便使用者使用。
  6. 使用者應能暫停和恢復自己的白板工作。

 

----為了增加白板的實用價值,可以考慮增加如與windows畫筆工具類似的畫正方形、圓形等類似功能。本例作為電子白板基本模型的建立,故沒有加入這些功能。實際上,只要瞭解了下面要介紹的白板通訊協議集的設計原則,增加以上功能是非常容易的。

通訊協議集的制定

----由於JAVA內建的標準基礎通訊協議是TCP/IP,所以我們只需在其基礎上建立電子白板的應用層協議集。協議集的模型將採用伺服器/客戶機的請求/應答模式。可以根據需要實現的白板功能制定通訊協議集,協議集中包括登入、圖形傳輸(分伺服器發出和客戶機發出兩部分)、文字傳輸(分伺服器發出和客戶機發出兩部分)、伺服器要求重新整理交談室及成員名單、客戶機要求重新整理交談室及成員名單、加入指定交談室、退出交談室、建立新交談室、暫停/恢復交流等部分。

----由於已經依靠TCP/IP協議保證資料傳輸的正確性,所以在這個電子白板的通訊協議集的設計中應在保證功能的前提下儘量簡潔,來提高頻寬利用率。白板通訊協議集的細節可參考如下:

----注意:(S)表示該部分由伺服器發出,客戶機接收;

----(C)表示該部分由客戶機發出,伺服器接收;

----資料格式表示:引號之間表示字串,(short)表示短整形數(2位元組),(int)表示標準整形數(4位元組)。

  • 登入(C):"log"→使用者名稱字串。
  • 圖形傳輸(客戶機發出)(C):"draw"→(int)顏色值→(short)直線起點橫座標→(short)直線起點縱座標→(short)直線終點橫座標→(short)直線終點縱座標。
  • 圖形傳輸(伺服器發出)(S):"draw"→(int)顏色值→(short)直線起點橫座標→(short)直線起點縱座標→(short)直線終點橫座標→(short)直線終點縱座標。
  • 文字傳輸(客戶機發出)(C):"text"→使用者在白板對話方塊中輸入的文字字串。
  • 文字傳輸(伺服器發出)(S):"text"→文字輸入者姓名字串→該使用者輸入的文字字串。
  • 伺服器要求重新整理交談室及成員名單(S):"refresh"→交談室1主題字串→交談室1中的使用者1姓名字串→交談室1中的使用者2姓名字串→...→"complete"→交談室2主題字串→交談室2中的使用者1姓名字串→交談室2 中的使用者2姓名字串→...→"complete"→...→最後一個交談室主題字串→最後一個交談室中的使用者1姓名字串→最後一個交談室中的使用者 2姓名字串→...→"complete"→"ok"。
  • 客戶機要求重新整理交談室及成員名單(C):"refresh"。(伺服器收到此命令,會執行前面的伺服器要求重新整理交談室及成員名單子協議,以響應客戶機請求)
  • 加入指定交談室(C):"join"→申請加入的交談室主題字串。
  • 退出交談室(C):"quit"。
  • 建立新交談室(C):"new"→申請建立的新交談室主題字串。(伺服器收到此命令,會自動在該使用者原來所在的交談室中登出,並使該使用者成為新交談室的一員)
  • 暫停交流(C):"pause"。
  • 恢復交流(C):"continue"。

 

----以上為本電子白板軟體所遵循的通訊協議集。這個協議集的可擴充性很強,可以隨時按增加的功能擴充協議集。例如需要傳送圓形圖案,則可將如下協議加到協議集中:"circle"→(int)顏色值→(short)圓心橫座標→(short)圓心縱座標→(short)圓半徑。

程式設計實現

----程式設計分伺服器JAVAApplication和客戶端JAVAApplet兩部分進行。

----程式設計中需要注意以下幾點:

  1. 伺服器程式不要採用客戶端接入時建立使用者執行緒,退出交談室時銷燬執行緒的工作流程。因為有些作業系統的執行緒操作機制不夠健全,線上程銷燬時執行緒所佔資源不能被完全釋放,以致於在白板伺服器執行的過程中將逐漸消耗掉系統資源。所以應在伺服器初始化時按照最大允許同時上線的使用者數建立所有使用者服務執行緒。這些執行緒將等待客戶端接入,當使用者退出交談室時執行緒並不銷燬,而是清除使用者資料,重新進入等待接入狀態,準備為下一個使用者服務。這樣就保證了白板伺服器可以長期可靠執行。
  2. 當使用者在白板上連續繪畫時可能產生大量的圖形資料,客戶端Applet若在白板的AWT 事件處理程式中完成將這些資料傳輸給伺服器的任務,則很有可能由於網路I/O的瓶頸作用,使得AWT事件處理執行緒受阻,從而影響白板Applet、瀏覽器、其他正在執行的應用軟體的介面相應性。解決的辦法就是使Applet再建立一個後臺繪圖資料傳輸執行緒,白板的AWT事件處理程式將使用者的繪圖資料通過管道流(PipedStream)傳輸給這個執行緒後就返回,把網路傳輸的任務留給這個執行緒進行。
  3. 在伺服器和客戶端Applet中,協議集每一個子協議的實現都要分別建立一個同步塊 (synchronize),該子協議的全部操作都要在這個同步塊內完成,以限制自由訪問網路接插建立的輸入流和輸出流。使得當一個執行緒執行一個子協議時能夠獨佔這些網路資源,而使別的執行緒不能訪問這些資源,以保證執行緒能夠完整正確地執行子協議。但是由於同步操作會降低執行緒排程和執行效率,所以要在確保子協議完整執行的前提下儘量縮小同步程式碼塊的範圍。
  4. 由於協議集中的資料型別既有字串又有整形數,因此在程式中選用 DataInputStream和DataOutputStream作為資料輸入流和輸出流。此外,由於UTF格式的文字支援中文字符集,且在字串中已包含長度資訊,可以方便資料讀取,故在本程式的網路通訊中的字串全部採用UTF格式。設計自己的白板程式時,可以根據需要換用其他文字格式和編碼規則,但一定要保證輸入流和輸出流採用的是同一種格式和編碼。
  5. 考慮到目前NetscapeNavigator3.0和InternetExplorer3.0目前仍普遍使用,而這兩種瀏覽器的JAVA虛擬機器都不支援較新的JDK1.1標準,所以在本程式的客戶機Applet部分中沒有使用JDK1.1特有的類庫。

 

----首先介紹伺服器程式的編制。需確定主要的幾個類及其成員函式。列表如下:
----ChatServer類:
----伺服器程式的啟動類。
----ChatServer():建立伺服器管理介面。
----initServer():建立伺服器插結,初始化交談室資料,按照允許同時上線的最大使用者數建立多個使用者服務執行緒。
----go():啟動使用者服務執行緒。
----quit():中止使用者服務執行緒,關閉伺服器插結,並釋放全部資源。
----User類:為Thread類的子類,實現使用者服務執行緒,處理伺服器/客戶機會話。
----run():等待客戶端接入;客戶端接入後初始化網路資源,進入迴圈偵聽客戶端請求的狀態,並根據客戶端的請求呼叫相應的協議處理程式。
----sendText():按照文字傳輸子協議,接收使用者發出的文字資訊,並轉發給同一交談室的其他使用者。
----sendDraw():按照圖形傳輸子協議,接收使用者發出的圖形資訊,並轉發給同一交談室的其他使用者。
----commandCenter():為伺服器接收到的指令選擇執行適當的處理程式。
----server_ask_refresh():伺服器主動重新整理交談室及成員名單。
----server_answer_reresh():響應客戶機要求重新整理交談室及成員名單。
----server_answer_log():響應客戶機登入。
----server_answer_join():響應使用者加入指定交談室請求。
----server_answer_pause():響應使用者暫停交流請求。
----server_answer_continue():響應使用者恢復交流請求。
----server_answer_newRoom():響應使用者建立新交談室請求。
----server_answer_quit():響應使用者退出交談室請求。
----server_ask_text():伺服器向客戶機轉發文字資訊。
----server_ask_draw():伺服器向客戶機轉發圖形資訊。
----refreshToAll():伺服器重新整理所有線上客戶端的交談室資料。
----refreshToAllNotMe():伺服器重新整理除該使用者外,所有線上客戶端的交談室資料。
----socketClose():使用者申請退出時呼叫,關閉網路插結,釋放執行緒佔用的網路資源。
----RoomGroup類:儲存所有交談室資料,直接處理與交談室有關操作。
----newRoom():建立新交談室。
----join():加入指定交談室。
----quit():退出指定交談室。
----getUsersName():返回指定交談室內的使用者名稱。
----getRoomID():按照交談室主題查詢並返回交談室ID號。
----Room類:儲存並處理本交談室使用者資料。
----join():加入本交談室。
----quit():退出本交談室。
----getUsersName():返回本交談室的使用者名稱。
----DataBag類:包裝圖形和文字資料。
----AboutDialog類:生成About對話方塊,可顯示版權資訊。
----QuitDialog類:生成QuitDialog對話方塊,用於確認是否結束伺服器執行。

----客戶機Applet包含的類及其主要成員函式如下:

----ChatApplet類:為Applet類的子類,實現Runnable介面。
----是白板Applet的核心類,完成與使用者交流和與伺服器通訊的任務。
----init():初始化Applet使用者介面。
----run()::迴圈偵聽來自白板伺服器的資訊,呼叫commandCenter命令處理程式。
----start():生成並啟動Applet執行緒。
----stop():中止Applet執行緒。
----destroy():中止後臺圖形資料傳送執行緒,呼叫關閉網路資源函式。
----socketClose():關閉所有開啟的網路插結和通訊流。
----openSocket():建立網路插結和通訊流。
----commandCenter():集中處理來自使用者和伺服器以及來自Applet內部的命令,呼叫相應的處理程式。
----client_ask_refresh():客戶機請求重新整理交談室資料。
----client_answer_refresh():客戶機接收伺服器傳送的交談室資料。
----client_ask_log():申請登入到伺服器。
----client_ask_join():申請加入指定交談室。
----client_ask_pause():暫停交流。
----client_ask_continue():恢復交流。
----client_ask_newRoom():申請建立新交談室。
----client_ask_quit():退出交談室。
----client_ask_text():傳送使用者輸入的文字資訊。
----client_answer_text():接收伺服器轉發的其他使用者的文字資訊。
----client_answer_draw():接收伺服器轉發的其他使用者的圖形資訊。
----refreshRoomList():顯示交談室列表。
----refreshUserList():顯示指定交談室中的使用者列表。
----printChat_Area():將該使用者和來自伺服器的其他使用者的輸入的文字用指定格式顯示在Applet的交談文字框中。
----sendText():判斷使用者輸入的文字是否為有效字串,若有效則呼叫傳送文字函式。
----drawBoard_Canvas():按DataBag物件的值,在Applet的白板上繪圖。
----boardCanvas_MouseDrag():當滑鼠在白板上拖動時呼叫此函式,將滑鼠軌跡包裝成資料包傳送給後臺網路傳輸執行緒。
----logButton_Clicked():當使用者單擊Applet的登入鈕時呼叫此函式,建立網路插結和後臺網路傳輸執行緒。
----其他一系列使用者介面事件處理函式:與使用者交流,接收使用者輸入,直接處理或呼叫commanCenter函式執行使用者命令。
----RoomData類:儲存該交談室的主題和使用者名稱的資料類
----addUser():在該交談室中新增使用者名稱。
----removeUser():在該交談室中刪除使用者名稱。
----getUsersName():返回所有在該交談室中的使用者名稱。
----Rooms類:為Vector類的子類。儲存所有交談室的使用者資料。
----getRoomByName():按交談室主題返回指定交談室的RoomData物件。
----addElement():新增RoomData物件。
----SendDrawData類:為Thread類的子類,實現後臺網路傳輸執行緒。
----run():迴圈偵聽來自Applet主執行緒的圖形資訊,並將其通過網路接插生成的輸出流傳送給伺服器。
----quit():關閉該執行緒與Applet主執行緒的連線流。
----Logo類:為Canvas類的子類。用於在Applet中顯示圖示或版權資訊。

----此外程式中還定義了幾個異常類,可以方便程式的異常處理機制設計,增加程式的可維護性和可讀性。Applet徽標的預設圖形檔名是"cdownlogo.jpg"(457×60),伺服器像標的預設圖形檔名是"icon.gif"(19× 17)。伺服器預設佔用的埠號為10000。以上各項可以視需要修改。

結論

----本文結合筆者的程式設計經驗初步介紹了基於瀏覽器和JAVA的電子白板軟體的程式設計過程,希望這些內容能夠對廣大軟體開發人員有所幫助。歡迎大家與筆者聯絡(lfl@cenpok.net),就電子白板的一些問題進行切磋和交流。

----附錄內容:

  1. 本電子白板系統的完整源程式。已測試通過,可以直接編譯執行。
  2. 嵌入Applet的主頁示範。請注意主頁中Applet的引數設定。
  3. 本電子白板客戶端Applet的使用者介面及操作方法簡介。

 

----附錄1:源程式:

----附錄3:電子白板客戶端使用說明

  1. 確保白板伺服器已在執行。使瀏覽器連線至本Applet所在主頁。以下操作均在Applet介面上進行
  2. 請在使用者名稱一欄中輸入您的使用者名稱,點選登入按鈕。
  3. 在交談室的選擇欄中挑選您願意加入的交談室,下面的當前交談室使用者列表會顯示出您所選擇的交談室中的現有使用者。點選加入交談室按鈕即可加入該交談室。
  4. 若您想建立新的交談室,請在新交談室主題一欄中輸入新的主題,點選建立交談室按鈕即可,並且您自動成為該交談室的一員。
  5. 加入或建立交談室後即可與同一交談室中的使用者進行交談和繪畫。

 

方法如下:

  1. 在繪畫白板的右側的調色盤中單擊繪畫需用的顏色。
  2. 在繪畫白板上按住滑鼠鍵拖動滑鼠即可繪出圖形。與此同時,該交談室中的其他使用者的繪畫白板上將同步自動繪出這些圖形。同理,您的白板上也將出現其他使用者繪製的圖形。
  3. 若感覺白板已較亂,則可點選清除白板圖畫按鈕,白板會自動清屏。這個操作不會影響交談室中的其他使用者的白板。
  4. 您可在主頁右下方的文字欄內輸入您想對同一交談室中其他使用者說的話,輸入後按Enter鍵或點選傳送按鈕則傳送給其他使用者。本交談室中所有使用者輸入的句子都將顯示在白板下方的文字框內。綜合使用繪畫與交談功能則可與網上其他使用者方便地進行實時交流。
  5. 加入交談室後,單擊暫停交談按鈕可以暫時停止與其他使用者交談。暫停後再單擊此按鈕即可恢復交談。
  6. 單擊退出交談室按鈕或離開交談室主頁將退出交談室。若需再次進入交談室,請重新登入。
  7. 請留意主頁左下方的系統資訊框,這裡將給出一些必要的操作提示。
    作者: 劉飛龍(清華大學)

相關文章