Android (Java) Socket ist immer NULL
-
-
ok geht ich bekomme jetzt noch ein fehler bei dem Printwriter also bei p.flush
-
was den genau ?
-
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) -
zeige mal wie du jetzt den Aufruf der send Methode jetzt machst
-
Connection con = new Connection("localhost",1980);
con.connect();while(con.con.isAlive()){
}
con.send("hallooo");
-
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.
-
ok probiere ich morgen mal aus
-
würde aber auch sagen das beim senden was schief geht
Process: com.tcp.passwordkeeper, PID: 8698
Das musst du mal auf deinen Server schauen. Was da los ist.
-
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. -
Hallo das Flush brauchst du eigentlich nicht. versuche es ohne.
https://stackoverflow.com/ques…use-flush-for-printwriter
-
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 wird beendet sobald der Code darin ausgeführt wurde.
Wenn du natürlich eine while-Scheife hast, die die Verbindung offen hält (habe mir deinen Code nicht angeschaut) dann wird der Thread solange nicht beendet.Ohne Fehlermeldung kann man dir dort nicht helfen.
-
ok, ist es möglich mit einer Verbindung mehrere Nachrichten zum Server senden ohne den Socket zu schließen weil beim 2. steht da das der Socket closed ist
-
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. -
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?
-
Was für ein Fehler kommt den eigentlich.
-
Wie du einen thread prüfst weißt du ja schon. Schaue dir das Beispiel an was ich dir gegeben habe. Da siehst du auch wie du auf einen thread wartest.
-
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)
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!