在Merlin之前,編寫Socket程序是比較繁瑣的工作.因為輸入輸出都必須同步.這樣,對于多客戶端客戶/服務器模式,不得不使用多線程.即為每個連接的客戶都分配一個線程來處理輸入輸出.由此而帶來的問題是可想而知的.程序員不得不為了避免死鎖,線程安全等問題,進行大量的編碼和測試.很多人都在抱怨為什么不在Java中引入異步輸入輸出機制.比較官方的解釋是,任何一種應用程序接口的引入,都必須兼容任何操作平臺.因為Java是跨平臺的.而當時支持異步輸入輸出機制的操作平臺顯然不可能是全部.自Java 2 Platform以后,分離出J2SE,J2ME,J2EE三種不同類型的應用程序接口,以適應不同的應用開發.Java標準的制訂者們意識到了這個問題,并且支持異步輸入輸出機制的操作平臺在當今操作平臺中處于主流地位.于是,Jdk(J2SE) 的第五次發布中引入了異步輸入輸出機制.
以前的Socket進程通信程序設計中,一般客戶端和服務器端程序設計如下:
服務器端:
//服務器端監聽線程
while (true) {
.............
Socket clientSocket;
clientSocket = socket.accept(); //取得客戶請求Socket,如果沒有//客戶請求連接,線程在此處阻塞
//用取得的Socket構造輸入輸出流
PrintStream os = new PrintStream(new
BufferedOutputStream(clientSocket.getOutputStream(),
1024), false);
BufferedReader is = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
//創建客戶會話線程,進行輸入輸出控制,為同步機制
new ClientSession();
.......
}
客戶端:
............
clientSocket = new Socket(HOSTNAME, LISTENPORT);//連接服務器套接字
//用取得的Socket構造輸入輸出流
PrintStream os = new PrintStream(new
BufferedOutputStream(clientSocket.getOutputStream(),
1024), false);
BufferedReader is = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
//進行輸入輸出控制
.......
以上代碼段只是用同步機制編寫Socket進程通信的一個框架,實際上要考慮的問題要復雜的多(有興趣的讀者可以參考我的一篇文章《Internet 實時通信系統設計與實現》)。將這樣一個框架列出來,只是為了與用異步機制實現的Socket進程通信進行比較。下面將介紹使用異步機制的程序設計。
回頁首
用異步輸入輸出流編寫Socket進程通信程序
在Merlin中加入了用于實現異步輸入輸出機制的應用程序接口包: