程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java中的異步網絡編程

Java中的異步網絡編程

編輯:JAVA編程入門知識

       該文章對編寫客戶服務器應用的Java程序員有所幫助,可以解決程序在對方出現故障的時候繼續穩定運行.

  目前java平台已經廣泛應用於各類客戶/服務器系統中,在實際編程中,往往需要網絡的異步處理。比如客戶程序,假如客戶程序運行先於服務程序,則客戶程序則需要在服務程序啟動後再自動連接服務程序;在客戶程序運行中假如服務程序中途停止,則也需要在不停止的條件下,等待服務程序運行並重新連接。下面提供了一類異步編程的方法。
  
  網絡異步應用涉及到如下幾個要害點:
  
  客戶應用啟動後,檢測服務應用是否存在。假如不存在,則等待服務應用啟動,同時不堵塞客戶應用其他任務的執行。一旦服務應用啟動,客戶應用應該及時的與其建立連接。
  客戶應用和服務應用在數據通信中,服務應用異常退出後,客戶應用應可以檢測到服務應用的退出。同時客戶應用自動清除該通信鏈路,回到初始狀態,等待服務應用重新啟動。
  
  該網絡異步編程首先涉及到一個定時器和定時器事件。該定時器用於不斷的檢測網絡中客戶應用和服務應用是否連通,同時在服務應用出現異常時中止數據通信,返回到初始狀態。網絡的故障可以通過網絡方法的異常處理獲知。
  
  定時器包含在網絡通信類中,使得使用該類的應用感知不到定時器的存在,而方便的處理網絡信息。
  
  該客戶程序類如下結構:
  public class NetComm
             implements ActionListener
  {
     
  javax.swing.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 [email protected]");
         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();
     }
  }
  
   
  
  在以上程序中,也可以為外部應用提供一個回調函數,以便在網絡異常或恢復正常時通知應用。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved