Java中的非同步網路程式設計 (轉)

worldblog發表於2007-12-09
Java中的非同步網路程式設計 (轉)[@more@]中的非同步

[ 作者: 郭洪鋒   新增時間: 2001-9-10 20:53:32 ]


對員有所幫助
郭洪鋒 (ghf_emai@china.com)

該文章對編寫客戶應用的java程式設計師有所幫助,可以解決程式在對方出現故障的時候繼續穩定執行.
目前java平臺已經廣泛應用於各類客戶/伺服器中,在實際程式設計中,往往需要網路的非同步處理。比如客戶程式,如果客戶程式執行先於服務程式,則客戶程式則需要在服務程式啟動後再自動連線服務程式;在客戶程式執行中如果服務程式中途停止,則也需要在不停止的條件下,等待服務程式執行並重新連線。下面提供了一類非同步程式設計的方法。

網路非同步應用涉及到如下幾個關鍵點:

客戶應用啟動後,檢測服務應用是否存在。如果不存在,則等待服務應用啟動,同時不堵塞客戶應用其他任務的。一旦服務應用啟動,客戶應用應該及時的與其建立連線。
客戶應用和服務應用在資料通訊中,服務應用異常退出後,客戶應用應可以檢測到服務應用的退出。同時客戶應用自動清除該通訊鏈路,回到初始狀態,等待服務應用重新啟動。

該網路非同步程式設計首先涉及到一個定時器和定時器事件。該定時器用於不斷的檢測網路中客戶應用和服務應用是否連通,同時在服務應用出現異常時中止資料通訊,返回到初始狀態。網路的故障可以透過網路方法的異常處理獲知。

定時器包含在網路通訊類中,使得使用該類的應用感知不到定時器的存在,而方便的處理網路資訊。

該客戶程式類如下結構:
public classComm
           implements ActionListener
{
   
javax..Timer timer = new javax.swing.Timer(3000,this);
       
Socket sock;
private EventNotifier en;
public static int    net_state = 0;
InetAddress ServerAddr;
int ServerPort;
   
public NetComm(InetAddress addr, int port){
   ServerAddr = addr;
   ServerPort  = port;
}

public void NetComm_Init() {
       
    net_state = 1;
       try {
           sock = new Socket(ServerAddr, ServerPort);
       } catch (IOException e) {
           net_state = 0;
       }
       timer.start();
}
   
public void NetComm_Data()
{
   try {
       OutputStream outputstream = sock.getOutputStream();
       
       BufferedWriter out = new BufferedWriter
           (new OutputStreamWriter(outputstream));
           
       out.write("java by ghf@china.com");
       out.flush();

       BufferedReader in = new BufferedReader
               (new InputStreamReader(sock.getInputStream()));
       
       boolean more = true;
       while(more) {
           String str = in.readLine();
           if(str == null) more = false;
           else
               // 處理資料
               System.out.println(str);
       }
           
       in.close();

       } catch (IOException e) {
       NetComm_Close();
       net_state = 0;
       }
   timer.start();
   }
   
   public void NetComm_Close()
   {
       if(sock != null)
           try{
               sock.close();
               } catch ( IOException e) {
           }
   }
   
   public void actionPerformed(ActionEvent e)
   {
       if(net_state == 0)
              NetComm_Init();
       else
                   NetComm_Data();
   }
}




在以上程式中,也可以為外部應用提供一個回撥,以便在網路異常或恢復正常時通知應用。服務應用的網路通訊類類似,可以放在同一類中。

關於作者
郭洪鋒,從事系統上的分散式應用系統開發,已有四年分散式應用系統開發。E-:ghf_@china.com。 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990126/,如需轉載,請註明出處,否則將追究法律責任。

相關文章