2012-01-27 118 views
0

我的客戶端應用程序需要能夠在幾種情況下恢復。 打開電源時,客戶端從文件讀取地址和端口並嘗試連接到服務器。 如果這是第一次在此主機上使用此客戶端,則嘗試使用默認IP地址,但這可能不正確。 用戶然後需要輸入正確的IP地址。該端口是硬編碼的。 現在的工作方式是一秒鐘的swing.Timer嘗試獲取服務器的狀態...強大的Java Socket編程

statusTimer = new Timer(ONE_SECOND, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     final byte GET_STATUS = 20; 
     SendCommand(GET_STATUS, null); 
    } 
}); 
statusTimer.start(); 

如果沒有連接用戶被要求連接...

private void SendCommand(byte command, byte[] parameters) { 
    if ((null == socket) || (null == outputStream) || socket.isClosed()) 
     if (JOptionPane.YES_OPTION == 
      JOptionPane.showConfirmDialog(null, "Connect?")) 
      Connect(); 
      ... 

private void Connect() { 
    String s = (String) 
     JOptionPane.showInputDialog(null, "Enter IP Address", ipAddress); 
    if (validateIp(s)) { 
     ipAddress = s; 
     connectTask = new ConnectTask(); 
     connectTask.start(); 
     ... 

打開套接字,設置io流並啓動RxThread。

class ConnectTask extends Thread { 
    @Override public void run() { 
     try { 
      if (null == socket) socket = new Socket(ipAddress, TCP_PORT); 
      if (null == outputStream) outputStream = socket.getOutputStream(); 
      if (null == inputStream) inputStream = socket.getInputStream(); 
      if (null == rxThread) rxThread = new RxThread(); 
      ... 

有一些不好的事情會發生在這一點上,例如:
1.當客戶端已開啓的服務器可能會關閉。客戶端自動打開套接字,設置io流並在服務器啓動時繼續運行的最佳方式是什麼?
2.以同樣的方式,服務器可能在讀取,寫入或兩者都不會看到電源循環。電源恢復後是否有自動恢復的好方法?
3.如上所述,可能需要更正IP地址。
這將是很好的處理這些和其他情況,而不需要用戶關閉和打開客戶端應用程序或電源循環系統。 防彈java客戶端套接字需要哪種方法?
Thisthis類似,但與服務器的套接字協議

回答

1

你需要能夠首次使用(當服務器的詳細信息可能是錯誤的,應提示用戶),後來使用之間的區別(當服務器可能正在關閉)。例如,您可以在用戶第一次輸入IP時保存文件。

之後,您可能需要如下內容:您嘗試連接到服務器並讀取數據的內部循環,超時。如果套接字由於網絡錯誤而關閉,則可以使用try-catch塊來捕獲該套接字。把所有這些放到一個外部循環中,以便在斷開連接時再次嘗試。

根據具體情況,假設數據量很小,您的客戶端可能最容易每次打開連接,而不是嘗試維持連接,然後在連接之間休眠。

如果服務器沒有響應,您當前的代碼(每秒使用一個Timer創建一個新的ConnectTask線程)可能最終會創建多個ConnectTasks,每秒創建一個,每個嘗試並行連接,儘管很難某些來自您發佈的部分代碼。