# Probleme mit Socket bei Android Studio?



## platofan23 (22. Okt 2018)

Hallo Communety,

Ich versuche mit Androidstudio eine Chat-App auf Basis von Java zu Programmieren.

Bisher hab ich eine Login-Aktivety erstellt. Nun versuche ich eine Socketverbindung aufzubauen und Daten zu einem Server zu vermitteln, den ich vorher schon genutzt habe. Nun bekomme ich diese Exception:


```
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: chat.chatclient, PID: 30824
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io_OutputStream java.net.Socket.getOutputStream()' on a null object reference
        at socketio.Socket.write(Socket.java:187)
        at chat.chatclient.Login.onClick(Login.java:52)
        at android.view.View.performClick(View.java:5646)
        at android.view.View$PerformClick.run(View.java:22473)
        at android.os.Handler.handleCallback(Handler.java:761)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:156)
        at android.app.ActivityThread.main(ActivityThread.java:6523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
```

Weiß einer was ich da tun muss?

Datein liegen hier als txt

https://we.tl/t-vXltVk4z68

LG

Platofan23


----------



## Robat (23. Okt 2018)

Mit was für einem Framework arbeitest du denn? `socketio.Socket` sagt mir jetzt spontan nichts.


----------



## platofan23 (23. Okt 2018)

Robat hat gesagt.:


> Mit was für einem Framework arbeitest du denn? `socketio.Socket` sagt mir jetzt spontan nichts.



das ist eine klasse die wir dann auch im abitur verwenden? soll ich die jar mal hochladen?


----------



## Robat (23. Okt 2018)

Wäre glaub ich mal ganz interessant, ja


----------



## platofan23 (23. Okt 2018)

Robat hat gesagt.:


> Wäre glaub ich mal ganz interessant, ja


ja schon dar. nun ich hab das jetzt mit dem normales sockets und out/inputstream gemacht. dazu brauchte ich ein thread aber nun wird der server eine exception:
Exception in thread "Thread-3" java.lang.StringIndexOutOfBoundsException: String index out of range: -4
        at java.lang.String.substring(String.java:1967)
        at Server$ClientHandler.run(Server.java:37)
        at java.lang.Thread.run(Thread.java:748)

das komische ist nur in java funktioniert es und android studio nicht...


----------



## Xyz1 (23. Okt 2018)

Wieso machst du eigentlich aus eis y's und lässt viele nicht unwichtige Vokale weg? Hoffentlich doch keine legasthenie!


----------



## Robat (23. Okt 2018)

platofan23 hat gesagt.:


> Exception in thread "Thread-3" java.lang.StringIndexOutOfBoundsException: String index out of range: -4


Und an welcher Stelle kommt die Fehlermeldung?


----------



## platofan23 (23. Okt 2018)

Robat hat gesagt.:


> Und an welcher Stelle kommt die Fehlermeldung?


Im Serverprogramm in Zeile 37. Muss wohl mit dem Substring zusammenhängen...


----------



## Robat (23. Okt 2018)

Schon klar. Zeig doch mal den Code 

Edit: Bitte code in [code=Java]YOUR CODE[/code] posten


----------



## platofan23 (23. Okt 2018)

DerWissende hat gesagt.:


> Wieso machst du eigentlich aus eis y's und lässt viele nicht unwichtige Vokale weg? Hoffentlich doch keine legasthenie!



Danke für die Tipps. Ich werde mir das in Zukunft zu Herzen nehmen. Und nein keine legasthenie mehr tippfehler


----------



## platofan23 (23. Okt 2018)

Robat hat gesagt.:


> Schon klar. Zeig doch mal den Code
> 
> Edit: Bitte code in [code=Java]YOUR CODE[/code] posten


Ich habe zum Vergleich dasselbe mit Socket.io für ein JavaFX mit dazugelegt, wo es auch funktioniert


----------



## mihe7 (23. Okt 2018)

Kann es sein, dass Du die socketio.Socket-Geschichten in einem AsyncTask ausführen musst? Gibt das Android-Log (logcat) diesbezüglich was her?


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> Kann es sein, dass Du die socketio.Socket-Geschichten in einem AsyncTask ausführen musst? Gibt das Android-Log (logcat) diesbezüglich was her?


 hmm da kenn ich leider nicht mit aus aber ich habe noch bei 

```
10/23 20:12:26: Launching app
$ adb install-multiple -r -t -p chat.chatclient C:\Users\Joel-Pc\AndroidStudioProjects\ChatClient\app\build\intermediates\split-apk\debug\slices\slice_1.apk
Split APKs installed in 1 s 868 ms
$ adb shell am start -n "chat.chatclient/chat.chatclient.Login" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Waiting for process to come online
Connected to process 10826 on device huawei-bln_l21-YTRDU17413000440
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/hwaps: JNI_OnLoad
I/HwSecImmHelper: mSecurityInputMethodService is null
I/HwSecImmHelper: mSecurityInputMethodService is null
I/System.out: /l d:g
I/System.out: Antwort: /l:false
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/HwPointEventFilter: do not support AFT because of no config
I/art: Do partial code cache collection, code=18KB, data=27KB
    After code cache collection, code=18KB, data=27KB
I/art: Increasing code cache capacity to 128KB
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/HwPointEventFilter: do not support AFT because of no config
I/art: Do partial code cache collection, code=44KB, data=54KB
    After code cache collection, code=44KB, data=54KB
    Increasing code cache capacity to 256KB
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/HwPointEventFilter: do not support AFT because of no config
W/IInputConnectionWrapper: reportFullscreenMode on inexistent InputConnection
E/HW-JPEG-DEC: [HME_JPEG_DEC_Delete](3321): HME_JPEG_DEC_Delete: decoder_ctx=null
E/HW-JPEG-DEC: [HME_JPEG_DEC_Delete](3321): HME_JPEG_DEC_Delete: decoder_ctx=null
E/HW-JPEG-DEC: [HME_JPEG_DEC_Delete](3321): HME_JPEG_DEC_Delete: decoder_ctx=null
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/HwPointEventFilter: do not support AFT because of no config
I/System.out: /l d:g
I/System.out: Antwort: /l:false
W/IInputConnectionWrapper: reportFullscreenMode on inexistent InputConnection
```

Diese Meldungen da stehen, wo ich nicht weiß ob es daran hängt und das logcat ist ewig lange...


----------



## mihe7 (23. Okt 2018)

Probier in Login#onClick(View) einfach mal (ungetestet):

```
@Override
public void onClick(View v) {
    new AsyncTask<Void, Void, String>() {
        @Override protected Void doInBrackground(Void ... params) {
            try { 
                Client c = new Client();
                Socket s = c.getSocket();
                if (!s.connect()) { return "Keine Verbindung"; }
                s.write("/l benutzer passwort"); // natürlich ersetzen!
                String response = s.readLine();
                s.close();
                return "Antwort: " + response;
            } catch (IOException ex) {
                ex.printStackTrace();
                return "Exception:  " + ex.getMessage();
            }
        }
        @Override protected void onPostExecute(String resp) {
            Toast.makeText(Login.this, resp, Toast.LENGTH_LONG).show();
        }
    }.execute();
}
```


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> Kann es sein, dass Du die socketio.Socket-Geschichten in einem AsyncTask ausführen musst? Gibt das Android-Log (logcat) diesbezüglich was her?



Hab den Fehler gefunden. Ich hab ja einen Printwriter benutzt und wenn ich nun sage socket.println(Nachricht) darf ich nicht noch ein "\n" am Ende einfügen. Das macht den String zu lang und ergibt die Exception.


----------



## mihe7 (23. Okt 2018)

1. Wo hast Du einen PrintWriter benutzt?
2. Warum sollte das dann unter Java SE funktionieren?


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> 1. Wo hast Du einen PrintWriter benutzt?
> 2. Warum sollte das dann unter Java SE funktionieren?


oh tut mir leid meinte den bufferedReader bin in der zeile verutscht.

achja danke für deine hilfe


----------



## mihe7 (23. Okt 2018)

Das gibt doch keinen Sinn: wieso solltest Du bei s.write() eine NullPointerException bekommen, weil Du irgendwo einen BufferedReader hernimmst? Wir reden schon noch von der eingangs verwendeten Klasse socketio.Socket?


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> Das gibt doch keinen Sinn: wieso solltest Du bei s.write() eine NullPointerException bekommen, weil Du irgendwo einen BufferedReader hernimmst? Wir reden schon noch von der eingangs verwendeten Klasse socketio.Socket?



Nicht mehr. Ich hab das auf das normale Socket angeändert mit output stream usw. und das habe ich vorher schon mal erwähnt dann...oder bin ich so dämlich und hab es wieder vergessen?


----------



## mihe7 (23. Okt 2018)

Nein, das hast Du schon erwähnt, darum habe ich ja sicherheitshalber noch mal nachgefragt. Denn ich habe mich hier


mihe7 hat gesagt.:


> Kann es sein, dass Du die socketio.Socket-Geschichten in einem AsyncTask ausführen musst?


ausdrücklich auf socketio.Socket bezogen


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> Nein, das hast Du schon erwähnt, darum habe ich ja sicherheitshalber noch mal nachgefragt. Denn ich habe mich hier
> 
> ausdrücklich auf socketio.Socket bezogen



tut mir leid dann ist das mein fehler, aber die überlegen haben mir trozdem geholfen den kleinen fehler zu finden. 3h da sitzen wegen 4 kleinen Zeichen


----------



## mihe7 (23. Okt 2018)

Ja, das kennt man


----------



## platofan23 (23. Okt 2018)

mihe7 hat gesagt.:


> Ja, das kennt man



und dann das ahhhhhhh wie dumm denkt man


----------

