前言
隨著Internet的迅速發展
在Email
WWW
FTP等傳統的非實時應用日趨成熟的同時
廣大網絡用戶對在線實時交流的需求不斷擴大
如網上會議
遠程教學
協同工作等
這方面的應用軟件也日益豐富起來
該類軟件主要分為兩類
一種是以目前BBS和主頁上的聊天室為代表的純文字型的交流工具
另一種就是本文要介紹的電子白板類交流工具
電子白板除了具備聊天室的全部功能外
更重要的是
它還引入了繪畫圖形交流功能
使網上交流的形象性和直觀性大大加強了
彌補了文字交流的不足
當分布在Internet不同位置的用戶用白板進行交流時
一個人在自己的白板上繪制的圖形可以馬上在別人的白板上顯示出來
好象大家都在同一塊白板上繪畫
彼此間的距離感大大縮短了
目前具有電子白板功能的軟件有微軟的Netmeeting等
此類軟件在使用前需要用安裝盤安裝(Netmeeting是Internet Explorer
的選裝件)
在設置完成後才能使用
相比而言
在主頁中用Java Applet實現白板功能就顯得優勢很大
因為它不需要傳統軟件的下載
安裝和設置的繁瑣步驟
只要用支持JAVA的浏覽器連接到該Applet所在主頁
就可以使用白板
用於浏覽器的普及性(大部分常用浏覽器都支持JAVA
如InternetExploer
與Netscape Navigator
及以上版本)使得這種電子白板的潛在客戶群是巨大的
此外
用JAVA編制電子白板軟件還有一個顯而易見的優勢
就是整個軟件(尤其是白板服務器)無須重新修改編譯就可在NT
Unix
Linux等支持JAVA的平台上運行
目前基於浏覽器和JAVA的電子白板正處於起步階段
筆者尚未在網上看到該類軟件
由於工作需要
筆者自行開發了一套此類電子白板軟件
這裡想將開發中的一些經驗介紹給大家
以達到共同交流的目的
工作原理
電子白板有兩種實現模型
一種是無白板服務器
因此僅支持兩個用戶直接連結
另一種是有白板服務器
原則上不限制同時上線人數和交談室個數
具體實現上可視服務器性能和需要而定
本文要介紹屬於後者
當用戶需用白板與他人交流時
需要先用浏覽器連到Applet所在主頁
Applet運行後會連接到該白板服務器
和服務器建立TCP連接
每個用戶可以在自己的白板上(嵌在Applet畫面中)繪制圖形和輸入文字
Applet會將這些信息通過已建立的網絡連接發往白板服務器
並不斷偵聽
接收來自白板服務器的圖形和文字信息
將其再現在用戶的白板中
白板服務器的作用是不斷偵聽
接收來自各Applet的信息
並將其轉發給其他用戶
由於浏覽器對Java Applet的限制
使得Applet只能訪問發送該Applet的宿主主機
因此只能在該Applet所在主機上運行白板服務器
使得Applet能建立和遠程白板服務器的聯系
功能設計
一個實用的電子白板系統應該具備以下基本功能
用戶在浏覽到白板主頁時
需登錄後才能進行交流
這將提供交流時用的名字
必要時還可做權限檢查
用戶能夠根據交談室的交談主題選擇參加和退出現有的交談室
並且能建立新的交談室
可以根據該電子白板系統的應用領域和需要附加一些權限設置
用戶只能和在同一交談室中的用戶交流
一個交談室的信息對於別的交談室是不可見的
白板應至少具有一些如更換畫筆顏色
清除畫板(僅影響自己的白板)等方便用戶的功能
白板應具有一個操作提示和操作信息反饋欄
對用戶顯示一些操作提示和操作結果信息
這樣可以方便用戶使用
用戶應能暫停和恢復自己的白板工作
為了增加白板的實用價值
可以考慮增加如與windows畫筆工具類似的畫正方形
圓形等類似功能
本例作為電子白板基本模型的建立
故沒有加入這些功能
實際上
只要了解了下面要介紹的白板通訊協議集的設計原則
增加以上功能是非常容易的
通訊協議集的制定
由於JAVA內置的標准基礎通訊協議是TCP/IP
所以我們只需在其基礎上建立電子白板的應用層協議集
協議集的模型將采用服務器/客戶機的請求/應答模式
可以根據需要實現的白板功能制定通訊協議集
協議集中包括登錄
圖形傳輸(分服務器發出和客戶機發出兩部分)
文字傳輸(分服務器發出和客戶機發出兩部分)
服務器要求刷新交談室及成員名單
客戶機要求刷新交談室及成員名單
加入指定交談室
退出交談室
建立新交談室
暫停/恢復交流等部分
由於已經依靠TCP/IP協議保證數據傳輸的正確性
所以在這個電子白板的通訊協議集的設計中應在保證功能的前提下盡量簡潔
來提高帶寬利用率
白板通訊協議集的細節可參考如下
注意
(S)表示該部分由服務器發出
客戶機接收
(C)表示該部分由客戶機發出
服務器接收
數據格式表示
引號之間表示字符串
(short)表示短整形數(
字節)
(int)表示標准整形數(
字節)
登錄(C)
log
→用戶名字符串
圖形傳輸(客戶機發出)(C)
draw
→(int)顏色值→(short)直線起點橫坐標→(short)直線起點縱坐標→(short)直線終點橫坐標→(short)直線終點縱坐標
圖形傳輸(服務器發出)(S)
draw
→(int)顏色值→(short)直線起點橫坐標→(short)直線起點縱坐標→(short)直線終點橫坐標→(short)直線終點縱坐標
文字傳輸(客戶機發出)(C)
text
→用戶在白板對話框中輸入的文字字符串
文字傳輸(服務器發出)(S)
text
→文字輸入者姓名字符串→該用戶輸入的文字字符串
服務器要求刷新交談室及成員名單(S)
refresh
→交談室
主題字符串→交談室
中的用戶
姓名字符串→交談室
中的用戶
姓名字符串→
→
complete
→交談室
主題字符串→交談室
中的用戶
姓名字符串→交談室
中的用戶
姓名字符串→
→
complete
→
→最後一個交談室主題字符串→最後一個交談室中的用戶
姓名字符串→最後一個交談室中的用戶
姓名字符串→
→
complete
→
ok
客戶機要求刷新交談室及成員名單(C)
refresh
(服務器收到此命令
會執行前面的服務器要求刷新交談室及成員名單子協議
以響應客戶機請求)
加入指定交談室(C)
join
→申請加入的交談室主題字符串
退出交談室(C)
quit
建立新交談室(C)
new
→申請建立的新交談室主題字符串
(服務器收到此命令
會自動在該用戶原來所在的交談室中注銷
並使該用戶成為新交談室的一員)
暫停交流(C)
pause
恢復交流(C)
continue
以上為本電子白板軟件所遵循的通訊協議集
這個協議集的可擴充性很強
可以隨時按增加的功能擴充協議集
例如需要傳送圓形圖案
則可將如下協議加到協議集中
circle
→(int)顏色值→(short)圓心橫坐標→(short)圓心縱坐標→(short)圓半徑
編程實現
程序設計分服務器JAVA Application和客戶端Java Applet兩部分進行
編程中需要注意以下幾點
服務器程序不要采用客戶端接入時建立用戶線程
退出交談室時銷毀線程的工作流程
因為有些操作系統的線程操作機制不夠健全
在線程銷毀時線程所占資源不能被完全釋放
以致於在白板服務器運行的過程中將逐漸消耗掉系統資源
所以應在服務器初始化時按照最大允許同時上線的用戶數建立所有用戶服務線程
這些線程將等待客戶端接入
當用戶退出交談室時線程並不銷毀
而是清除用戶數據
重新進入等待接入狀態
准備為下一個用戶服務
這樣就保證了白板服務器可以長期可靠運行
當用戶在白板上連續繪畫時可能產生大量的圖形數據
客戶端Applet若在白板的AWT事件處理程序中完成將這些數據傳輸給服務器的任務
則很有可能由於網絡I/O的瓶頸作用
使得AWT事件處理線程受阻
從而影響白板Applet
浏覽器
其他正在運行的應用軟件的界面相應性
解決的辦法就是使Applet再建立一個後台繪圖數據傳輸線程
白板的AWT事件處理程序將用戶的繪圖數據通過管道流(PipedStream)傳輸給這個線程後就返回
把網絡傳輸的任務留給這個線程進行
在服務器和客戶端Applet中
協議集每一個子協議的實現都要分別建立一個同步塊(synchronize)
該子協議的全部操作都要在這個同步塊內完成
以限制自由訪問網絡接插建立的輸入流和輸出流
使得當一個線程執行一個子協議時能夠獨占這些網絡資源
而使別的線程不能訪問這些資源
以保證線程能夠完整正確地執行子協議
但是由於同步操作會降低線程調度和執行效率
所以要在確保子協議完整執行的前提下盡量縮小同步代碼塊的范圍
由於協議集中的數據類型既有字符串又有整形數
因此在程序中選用DataInputStream和DataOutputStream作為數據輸入流和輸出流
此外
由於UTF格式的文本支持中文字符集
且在字符串中已包含長度信息
可以方便數據讀取
故在本程序的網絡通信中的字符串全部采用UTF格式
設計自己的白板程序時
可以根據需要換用其他文本格式和編碼規則
但一定要保證輸入流和輸出流采用的是同一種格式和編碼
考慮到目前Netscape Navigator
和Internet Explorer
目前仍普遍使用
而這兩種浏覽器的JAVA虛擬機都不支持較新的JDK
標准
所以在本程序的客戶機Applet部分中沒有使用JDK
特有的類庫
首先介紹服務器程序的編制
需確定主要的幾個類及其成員函數
列表如下
ChatServer類
服務器程序的啟動類
ChatServer()
建立服務器管理界面
initServer()
建立服務器插結
初始化交談室數據
按照
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19560.html