Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          網絡編程中的異步編程

          該文章對編寫客戶服務器應用的java程序員有所幫助,可以解決程序在對方出現故障的時候繼續穩定運行.
            目前java平臺已經廣泛應用于各類客戶/服務器系統中,在實際編程中,往往需要網絡的異步處理。比如客戶程序,如果客戶程序運行先于服務程序,則客戶程序則需要在服務程序啟動后再自動連接服務程序;在客戶程序運行中如果服務程序中途停止,則也需要在不停止的條件下,等待服務程序運行并重新連接。下面提供了一類異步編程的方法。
          網絡異步應用涉及到如下幾個關鍵點:
            客戶應用啟動后,檢測服務應用是否存在。如果不存在,則等待服務應用啟動,同時不堵塞客戶應用其他任務的執行。一旦服務應用啟動,客戶應用應該及時的與其建立連接。
            客戶應用和服務應用在數據通信中,服務應用異常退出后,客戶應用應可以檢測到服務應用的退出。同時客戶應用自動清除該通信鏈路,回到初始狀態,等待服務應用重新啟動。
            該網絡異步編程首先涉及到一個定時器和定時器事件。該定時器用于不斷的檢測網絡中客戶應用和服務應用是否連通,同時在服務應用出現異常時中止數據通信,返回到初始狀態。網絡的故障可以通過網絡方法的異常處理獲知。
            定時器包含在網絡通信類中,使得使用該類的應用感知不到定時器的存在,而方便的處理網絡信息。
          該客戶程序類如下結構:
          /*
           * Classname       : NetComm.java
           * Create Date     : 5:04:00 PM
           * Author          : Administrator
           * Product Name    : tagApp

           
          */


          package jdom;

          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.io.BufferedReader;
          import java.io.BufferedWriter;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.io.OutputStreamWriter;
          import java.net.InetAddress;
          import java.net.Socket;

          public class NetComm implements ActionListener {

              javax.swing.Timer timer 
          = new javax.swing.Timer(3000this);

              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;
              }


              
          //初始化并創建socket連接
              public void NetComm_Init() {

                  net_state 
          = 1;
                  
          try {
                      sock 
          = new Socket(ServerAddr, ServerPort);
                  }
           catch (IOException e) {
                      net_state 
          = 0;
                  }

                  timer.start();
              }

              
              
          //創建socket連接
              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();
                  }

              }

          }


          在以上程序中,也可以為外部應用提供一個回調函數,以便在網絡異?;蚧謴驼r通知應用。服務應用的網絡通信類類似,可以放在同一類中。

          posted on 2008-03-27 16:58 都市淘沙者 閱讀(367) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          主站蜘蛛池模板: 根河市| 札达县| 兴业县| 蓬溪县| 从江县| 资阳市| 临清市| 河源市| 洛川县| 陵川县| 商河县| 洪泽县| 嘉荫县| 阿城市| 迁西县| 顺义区| 邯郸市| 金昌市| 新密市| 平舆县| 河曲县| 永吉县| 安顺市| 海盐县| 西和县| 肇庆市| 盘山县| 仁怀市| 文水县| 九龙坡区| 靖江市| 张家界市| 西城区| 利津县| 惠州市| 炉霍县| 麦盖提县| 博湖县| 静安区| 浦江县| 洮南市|