Android (Java) Socket ist immer NULL

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PrintWriter p = new PrintWriter(socket.getOutputStream());
    p.write(text);
    p.flush(); <----------- Hier
    p.close();


    2019-01-24 22:22:09.768 8698-8698/com.tcp.passwordkeeper E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.tcp.passwordkeeper, PID: 8698
    java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24704)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6590)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24704)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6590)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:108)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
    at java.io.BufferedWriter.flush(BufferedWriter.java:254)
    at java.io.PrintWriter.flush(PrintWriter.java:320)
    at com.tcp.passwordkeeper.Connection.send(Connection.java:74)
    at com.tcp.passwordkeeper.MainActivity.onclick(MainActivity.java:29)
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24704)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6590)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
  • es sieht mir so aus als ob der Main thread zu lange blockiert wird .
    Das mit der while schleife ist nicht gut so zuwarten bis der thread fertig ist. Damit blockiert du dir den Main thread.
    Macht somit auch keinen Sinn das du eine thread benutz wenn du somit den Main trotzdem anhählst.solange der thread läuft. Das macht absolut keinen Sinn.

    Es würde auch viel mehr sinn machen die sende Methode in einem thread laufen zu lassen.
    Teste wie lange es dauert bis die Daten gesendet sind.

    Ansonsten weiß ich auch nicht weiter.
    Ein Feedback auf Tipps ist auch schön. :P
  • mache dir zum Test mal zwei Button einer zu Verbindung aufbauen und einer zum senden.
    Somit findest du heraus ob es beim Verbindungs aufbau ist oder beim senden.

    Setze dir logs zwischen den befehlen um in Echtzeit zu sehen wo er hängen bleibt.
    Hast du das mit dem debugger getestet im einzelschritt?
    Und bei dem fluch blieb er hängen. Dann wüde ich schon sagen das es am Server ligt.
    Ein Feedback auf Tipps ist auch schön. :P
  • Ok danke es funktioniert jetzt habe einfach beim senden einen neuen thread gemacht und dort gewartet bis der andere thread fertig ist , das flush habe ich jetzt auch weggelassen funktioniert jetzt!

    Eine frage noch : wenn ich ein thread starte mit Thread t = new Thread(Runnable...) t.start(); und wenn der thread fertig ist würd der dann beenden weil wenn ich mal z.b 2 mal eine verbindung aufbaue das dann nicht 2 threads sind und halt mehr


    MFG knimix
  • und wenn ich verbunden bin also ich habe jetzt 2 buttons einen zum verbinden und einem zum senden. Das erste mal geht nachricht kommt auf dem server an aber wenn ich nochmal sende gibt der mir ein Error mein Printwriter

    PrintWriter p = new PrintWriter(socket.getOutputStream());
    p.write(text); <----- Hier
    p.close()
  • Ein thread ist beendet wenn er durchgelaufen ist. Einen thread kannst nicht ein zweites Mal starten. Dafür brauchst du eine neue Instanz des threades.
    Wenn du dein socket in einer globale variable in der Klasse hälst solte die Verbindung erhalten bleiben. Müßte bei dir so sein.
    Deshalb habe ich dir auch empfohlen die ver Bindung in der onResume zu erstellen und in der onpause zu beenden. Somit ist deine Verbindung vorhanden wen deine Activity im Vordergrund ist den Fokus hat.

    Du zum wiederholten senden brauchst du nur deine sede Routine aufrufen
    Aber nicht deine verbinden Methode denn da beendest du ja die Verbindung wenn eine besteht.
    Ein Feedback auf Tipps ist auch schön. :P
  • ja das ist ja klar aber ich erstelle einmal eine instaz in der "main" und dann rufe ich einmal connect() auf dann kann ich auch eine nachricht senden mit sendText() aber wenn ich die zweimal die methode bekomme ich ein error das habe ich ja gepostet also ich denke es lieg wieder daran das ich das gleichzeig aufrufe aber wie soll man das machen? Wie soll man in einem Thread checken ob der gleiche Thread zuvor schon fertig ist?
  • 2019-01-25 16:39:56.339 10937-10971/com.tcp.passwordkeeper W/System.err: java.net.SocketException: Socket is closed
    2019-01-25 16:39:56.340 10937-10971/com.tcp.passwordkeeper W/System.err: at java.net.Socket.getOutputStream(Socket.java:970)
    2019-01-25 16:39:56.341 10937-10971/com.tcp.passwordkeeper W/System.err: at com.tcp.passwordkeeper.Connection$2.run(Connection.java:91)
    2019-01-25 16:39:56.341 10937-10971/com.tcp.passwordkeeper W/System.err: at java.lang.Thread.run(Thread.java:764)