用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的電子白板軟件的程序設計過程,希望這些內容能夠對廣大軟件開發人員有所幫助。歡迎大家與筆者聯繫([email protected]),就電子白板的一些問題進行切磋和交流。

----附錄內容:

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

 

----附錄1:源程序:

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

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

 

方法如下:

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

上一頁 下一頁

發佈了117 篇原創文章 · 獲贊 1 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章