2013-01-23 74 views
0

我爲我們的全球Leadbord編寫了一個服務器,現在它實際上可以工作。 如果它處於活動狀態,我可以向其發送數據。但是,如果它失敗了,我的應用程序不會停止。我沒有得到它的解決方案,我希望你能幫助我。這裏是發送:如果服務器宕機,TCPsending會崩潰應用程序

public void saveToDatabase(LeadboardElement element2) { 
    final LeadboardElement element = element2; 
    send = false; 
    // Need to be a thread! else android blocks it because it could take to 
    // long to send! 
    this.thread = new Thread() { 
     public void run() { 
      try { 
       Socket soc = new Socket(Config.TCP_SERVERNAME_IP, 
         Config.TCP_PORT); 
       DataOutputStream out = new DataOutputStream(
         soc.getOutputStream()); 
       DataInputStream in = new DataInputStream(
         new BufferedInputStream(soc.getInputStream())); 

       // to call the save statement! 
       out.writeInt(0); 
       // give the stuff 
       out.writeUTF(element.getName()); 
       out.writeInt(element.getLevel()); 
       out.writeInt(element.getKillPoints()); 

       // close it 
       out.close(); 
       in.close(); 
       soc.close(); 
       send = true; 
       //join at every error 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    // start it 
    thread.start(); 

    // join thread 
    if (!send) { 
     boolean retry = true; 
     while(retry) 
     try { 
      this.thread.join(); 
      retry = false; 
      Log.w(TAG, "sending to server stopped!"); 
     } catch (InterruptedException e2) { 
      Log.w(TAG, "Thread could not be joined"); 
     } 
    } 
} 

我注意到,我需要做的是在一個線程,因爲API 5所以它是這樣工作的。如果玩家觸摸屏幕,則在遊戲結束時調用它。一切都停止了,數據被髮送到服務器。如果他們失敗了,我們會陷入黑色的褪色。 我想我需要像超時。我用CountDownTimer試了一下,但這個實際上並沒有解決問題。

非常感謝!

回答

2

更改您初始化套接字的方式,您可以設置超時。

Socket s1 = new Socket(); 
s1.setSoTimeout(200); 
s1.connect(new InetSocketAddress("192.168.1." + i, 1254), 200); 

Add a timeout when creating a new Socket

+0

我很遺憾的轉播,我只是沒有找到這個解決方案。非常感謝快速幫助它修復它! – BennX

相關問題