App stürzt bei Versuch einen TCPSocket zu erstellen ab

F

Fubinat0r

Neues Mitglied
0
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!
 
logcat
 
Achso:

03-05 12:38:29.402: E/AndroidRuntime(564): at java.net.Socket.<init>(Socket.java:177)
03-05 12:38:29.402: E/AndroidRuntime(564): at java.net.Socket.<init>(Socket.java:149)
03-05 12:38:29.402: E/AndroidRuntime(564): at rocket.launcher.RaketenwerferActivity.verbinden(RaketenwerferActivity.java:36)
03-05 12:38:29.402: E/AndroidRuntime(564): ... 14 more
03-05 12:38:32.771: I/Process(564): Sending signal. PID: 564 SIG: 9
03-05 12:38:43.241: D/gralloc_goldfish(604): Emulator without GPU emulation detected.
03-05 12:38:47.950: D/AndroidRuntime(604): Shutting down VM
03-05 12:38:47.950: W/dalvikvm(604): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-05 12:38:47.990: E/AndroidRuntime(604): FATAL EXCEPTION: main
03-05 12:38:47.990: E/AndroidRuntime(604): java.lang.IllegalStateException: Could not execute method of the activity
03-05 12:38:47.990: E/AndroidRuntime(604): at android.view.View$1.onClick(View.java:3044)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.view.View.performClick(View.java:3511)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.view.View$PerformClick.run(View.java:14105)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.os.Handler.handleCallback(Handler.java:605)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.os.Handler.dispatchMessage(Handler.java:92)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.os.Looper.loop(Looper.java:137)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.lang.reflect.Method.invoke(Method.java:511)
03-05 12:38:47.990: E/AndroidRuntime(604): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 12:38:47.990: E/AndroidRuntime(604): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-05 12:38:47.990: E/AndroidRuntime(604): at dalvik.system.NativeStart.main(Native Method)
03-05 12:38:47.990: E/AndroidRuntime(604): Caused by: java.lang.reflect.InvocationTargetException
03-05 12:38:47.990: E/AndroidRuntime(604): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.lang.reflect.Method.invoke(Method.java:511)
03-05 12:38:47.990: E/AndroidRuntime(604): at android.view.View$1.onClick(View.java:3039)
03-05 12:38:47.990: E/AndroidRuntime(604): ... 11 more
03-05 12:38:47.990: E/AndroidRuntime(604): Caused by: android.os.NetworkOnMainThreadException
03-05 12:38:47.990: E/AndroidRuntime(604): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
03-05 12:38:47.990: E/AndroidRuntime(604): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
03-05 12:38:47.990: E/AndroidRuntime(604): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
03-05 12:38:47.990: E/AndroidRuntime(604): at libcore.io.IoBridge.connect(IoBridge.java:112)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.Socket.startupSocket(Socket.java:566)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.Socket.tryAllAddresses(Socket.java:127)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.Socket.<init>(Socket.java:177)
03-05 12:38:47.990: E/AndroidRuntime(604): at java.net.Socket.<init>(Socket.java:149)
03-05 12:38:47.990: E/AndroidRuntime(604): at rocket.launcher.RaketenwerferActivity.verbinden(RaketenwerferActivity.java:36)
03-05 12:38:47.990: E/AndroidRuntime(604): ... 14 more
 
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.
 
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?
 
Timeout setzt du doch schon und die Exception fängst du auch.
Was genau möchtest du noch?
 
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.
 
Warum sollte der Dialog geschlossen werden wenn die Verbindung klappt? Dann landest du ja nicht im catch block.
 
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:

Ähnliche Themen

S
Antworten
8
Aufrufe
508
swa00
swa00
Muecke1982
Antworten
8
Aufrufe
1.032
Skyhigh
Skyhigh
W
Antworten
2
Aufrufe
739
rene3006
R
Zurück
Oben Unten