2017-03-17 2 views
0

Ich erstelle eine Android-App, die zu einem Server (Java) über Sockets verbindet.Ich habe eine Server-Anwendung in Schwung, die Start-Schaltfläche, die einen Port, den ich angegeben habe, öffnen erstellt.Verbindung zum Server, aber Server hat nicht gestartet Java

Also meine Frage ist, wie kann ich mit der Situation umgehen, wenn Client versuchen, eine Verbindung herzustellen, aber der Server nicht gestartet bedeutet, ich habe nicht auf Start-Taste klicken? Und ich will auch im Dialogfeld für Client erstellen, die den Server

ich diesen Code vorzuschlagen versucht haben, beginnen aber die bekommen hängen meine Anwendung:

Ich habe mit diesem wirklich verwirrt bekam!

Hier Code ist:

try { 
     cs = new Socket(IPADD,PORT); 
     if(cs.isConnected()) 
     { Toast.makeText(ipInfo.this,"Connected",Toast.LENGTH_SHORT).show(); 
      Intent inst = new Intent(ipInfo.this,homeActivity.class); 
      inst.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(inst); 
      finish(); 
     }else { 
      Toast.makeText(ipInfo.this,"Server is disconnected\nStart server in desktop",Toast.LENGTH_SHORT).show(); 
      } 
    }catch (IOException e) 
    {Toast.makeText(ipInfo.this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
    }catch (Exception e) 
    {Toast.makeText(ipInfo.this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
} 
+0

In welcher Weise funktioniert Ihr Code nicht? Ist das ein Fehler? –

+0

Nein, es gibt keinen Fehler, aber wenn ich versuche, seine Verbindung zu hängen hängt die Anwendung – Neel

+0

@SteveSmith bedeutet Server hat noch nicht gestartet und dann habe ich versucht, eine Verbindung herzustellen – Neel

Antwort

0

Ihr Code hängt nicht permanent, er wartet nur auf das Timeout, da der Server nicht reagiert, und Sie erhalten eine Ausnahme von . Fangen Sie dies und zeigen Sie Ihre "Start Server" Nachricht innerhalb des Catch.

try { 
    Socket socket = new Socket(); 
    // 1000 is the timeout 
    socket.connect(new InetSocketAddress(IPADD, PORT), 1000); 
    Toast.makeText(ipInfo.this,"Connected",Toast.LENGTH_SHORT).show(); 
    Intent inst = new Intent(ipInfo.this,homeActivity.class); 
    inst.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(inst); 
    finish(); 
} catch (IOException e) 
    Toast.makeText(ipInfo.this,"Server is disconnected\nStart server in desktop",Toast.LENGTH_SHORT).show(); 
} catch (Exception e) { 
    Toast.makeText(ipInfo.this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
} 
+0

, so muss ich in catch Block mit unbekannten Host-Ausnahme hinzufügen und dann Timeout in diesem, bin ich richtig? Wenn nicht, könntest du bitte den Code Teil – Neel

+0

machen, den ich mit catch part gemacht habe, aber wo sollte ich 'setSoTimeout' setzen? – Neel

+0

Siehe meine bearbeitete Antwort. –

0

Ich glaube, Sie für es verbunden warten müssen - es gibt keinen Rückruf? Der Code sagt:

/** 
* Returns the connection state of the socket. 
* <p> 
* Note: Closing a socket doesn't clear its connection state, which means 
* this method will return <code>true</code> for a closed socket 
* (see {@link #isClosed()}) if it was successfuly connected prior 
* to being closed. 
* 
* @return true if the socket was successfuly connected to a server 
* @since 1.4 
*/ 
public boolean isConnected() { 
    // Before 1.3 Sockets were always connected during creation 
    return connected || oldImpl; 
} 

so isConnected() nur einen statischen Wert zurückgibt, die tatsächlich geändert haben unwahrscheinlich ist, so sofort, nachdem Sie die Buchse instanziiert. Es gibt viele Netzwerkbibliotheken für Android. Sofern Sie dies nicht unbedingt tun müssen, empfehle ich die Verwendung von Retorfit oder Volley (insbesondere Retrofit), oder vielleicht nur einen OKHTTP-Client und verwenden Sie dies?

+0

können Sie vorschlagen, einige modifizierte Code Teil, weil ich neu zu diesem eine Art von:/ – Neel

0

Ihr Socket-Code kann niemals funktionieren. Es muss in einem Thread oder AsyncTask ausgeführt werden. Und wenn Sie das tun, können Sie Toast() s dann nicht anzeigen.

Also was machst du?

+0

ich möchte eine Nachricht an den Client anzeigen, dass "Server nicht gestartet wurde, bitte starte den Server" – Neel

Verwandte Themen