1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

App stürzt bei Versuch einen TCPSocket zu erstellen ab

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Fubinat0r, 05.03.2012.

  1. Fubinat0r, 05.03.2012 #1
    Fubinat0r

    Fubinat0r Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2010
    Hi,
    ich sitze derzeit an meiner Facharbeit in Informatik und komme seit Stunden nicht weiter. Ich möchte über einen TCP-Socket mein Handy mit dem Computer verbinden. Die Serverseite funktioniert einwandfrei, denn wenn ich einen Clienten starte, der keine Androidapp ist, kann ich connecten. Wenn ich nun jedoch versuche über die App einen Clienten zu erstellen, stürzt mir das programm ab. Wichtig wäre evtl. zu wissen, dass es mir abstürzt seit ich folgendes in der Manifest.xml stehen hab:
    Code:
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    Vorher schlug die Verbindung einfach immer fehl.

    Hier mal die wichtigen Codeschnipsel der Clienten und Serverseite:

    Server
    Code:
        public TCPServer() 
        {    
            try
            {
                sSocket = new ServerSocket(port);
            }    catch(IOException e)
            {
                System.out.println("Could not listen on port: " + port);
                System.exit(-1);
            } 
        }
        
        public void akzeptieren()
        {
            
            Socket client = null;
            while(true){
                try
                    {
                        System.out.println("Warte auf eingehende Verbindung");
                        sSocket.setSoTimeout( 60000 );
                        client = sSocket.accept();
                        System.out.println("Verbindung wurde hergestellt!");
                    }     catch(IOException e)
                    {
                    System.out.println( "Timeout!" );
                }
            }
        }
    
    Client:
    Code:
        public void verbinden(View v) {
            
            try{
                clientSocket = new Socket(ipa, 4224);
                setContentView(R.layout.main);
            }    catch (IOException e)
            {
                VerbindungFail = Toast.makeText(RaketenwerferActivity.this, "Verbindung fehlgeschlagen!", Toast.LENGTH_SHORT); 
                VerbindungFail.show();
            }        
        }
    

    Ich hoffe ihr könnt mir schnellstmöglich irgendwie weiterhelfen!
     
  2. the_alien, 05.03.2012 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    logcat
     
  3. Fubinat0r, 05.03.2012 #3
    Fubinat0r

    Fubinat0r Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2010
    Achso:

     
  4. the_alien, 05.03.2012 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Da haben wir das Problem doch: NetworkOnMainThreadException

    Du musst einen neuen Thread aufmachen um eine Netzwerkverbindung herzustellen. Wenn du nur Daten laden möchtest am einfachsten über einen AsyncTask.
     
  5. Fubinat0r, 05.03.2012 #5
    Fubinat0r

    Fubinat0r Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2010
    Danke, das hat mir schonmal weitergeholfen. Die Verbindung klappt anscheinend nun. Eine kleine Frage hätte ich noch:
    Kann den Clienten irgendwie timeouten lassen, wenn er ne bestimmte Zeit nicht Connecten kann bzw dass er einfach vom try in den catch block springt?
     
  6. the_alien, 05.03.2012 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Timeout setzt du doch schon und die Exception fängst du auch.
    Was genau möchtest du noch?
     
  7. Fubinat0r, 05.03.2012 #7
    Fubinat0r

    Fubinat0r Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2010
    Mein code sieht derzeit so aus:
    Code:
    public void verbinden(View v) {
            pd = ProgressDialog.show(this, "Verbinden", "Verbinde...", true, false);
            Thread thread = new Thread(this);
            thread.start();
            setContentView(R.layout.main);
        }
        
        public void run() {
            try{
                clientSocket = new Socket(ipa, 4224);
                handler.sendEmptyMessage(0);
            }    catch (IOException e)
            {
                handler.sendEmptyMessage(0);
                VerbindungFail = Toast.makeText(RaketenwerferActivity.this, "Verbindung fehlgeschlagen!", Toast.LENGTH_SHORT); 
                VerbindungFail.show();
            }
        }
        
        private Handler handler = new Handler(){
            public void handleMessage(Message msg) {
                pd.dismiss();
        }
    Wenn er keine Verbindung kriegt, dann bleibt der Progressdialog, d.h. er hängt wohl an der " clientSocket = new Socket(ipa, 4224);" Zeile. Weil wenn er nicht connecten kann, dann müsste re ja in de Exception springen und den Dialog schließen und den Toast anzeigen und wenn er Connecten kann müsste sich der Dialog ebenfalls schließen. Da er ja bleibt und ich das nicht möchte, will ich, dass er nach ner bestimmten Zeit, in der er nicht connecten kann, den Catch-Block ausführt.
     
  8. the_alien, 05.03.2012 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Warum sollte der Dialog geschlossen werden wenn die Verbindung klappt? Dann landest du ja nicht im catch block.
     
  9. Fubinat0r, 05.03.2012 #9
    Fubinat0r

    Fubinat0r Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    28.04.2010
    Ne, ne. Er soll geschlossen werden, wenn die Verbindung ne bestimmte Zeit lang nicht klappt. Das macht er ja von alleine, dauert nur etwas lange.

    Das ist halt grade zu Testzwecken schön, wenn man ihn nach 5 Sekunden timeouten lassen kann und nicht 2 Minuten warten muss.
     
    Zuletzt bearbeitet: 05.03.2012

Diese Seite empfehlen