socket: Unterschiede zwischen Android 7.0 und 8.0

  • 10 Antworten
  • Letztes Antwortdatum
M

maksimilian

Ambitioniertes Mitglied
0
Hallo Ihr,

in einemTCP-Client wird in einem AsyncTask ein Socket mit
Code:
socket = new Socket(ServerIP, ServerPort);

zur Kommunikation mit einem Server eingerichtet. Das funktioniert mit Android 7.0 aber nicht in Android 8.0 Der Client bleibt in der Anweisung hängen. Mangels Erfahrung ist der Trace im Android Studio noch keine Hilfe für mich. Kann mir jemand einen Tipp geben ?

maksimilian
 
Hallo der Constructor ist in beiden APIs 24, 26 sogar auch unter 30+ noch vorhanden.

Da müsstest du uns schon etwas mehr geben um dazu etwas sagen zu können.
An dem erstellen des Objektes wird es nicht ligen.
Welcher Fehlermeldung kommt denn?
 
Zuletzt bearbeitet:
Es gibt keine Fehlermeldung. Der Client bleibt in der Anweisung hängen.

Wenn ich im Debug-Modus schrittweise durchgehe, gibt es im Debug-Fenster mal den Eintrag "Connection Error:152;IoBridge". Ich weiß aber nicht, ob das einen Bezug zu meinem Problem hat.
Der new socket Aufruf erfolgt in einem try-Block, was aber nicht zum Aufruf einer catch-Klausel führt. Kann ich noch irgendetwas in den Code einfügen, was die Analyse ermöglicht ?
 
Connection Error:152;IoBridge
würde auf etwas mit deiner Netzwerk Verbindung hindeuten.

Ohne Code kann man hier wenig sagen.

Ich wüste nicht was sich bei dem Socket vom API 24 zu 26 geändert haben soll.
Fürst du das auch in einem Thread aus?


Wie und wo testest du auf einem echten Gerät Androoid 7 und 8,
oder nur mit einem Emulator der ein Image vom 7 oder 8 hat?
Beiträge automatisch zusammengeführt:

Der new socket Aufruf erfolgt in einem try-Block, was aber nicht zum Aufruf einer catch-Klausel führt.
Zeigt dir eigentlich das da nicht der Fehler sein wird. Wenn deine Adresse und Port stimmt und der Server auch bereit ist.
 
Zuletzt bearbeitet:
Ich teste den Client mit Android Studio auf zwei verschiedenen Samsung A300 Smartphones (310 mit 7.0 und 320 mit 8.0). Im Android Studio ist für das Projekt API 30 eingestellt. Als Port wird 50000 verwendet, daran kann's ja nicht liegen, auch nicht an einer Port-Sperre für das 8.0 Smartphone. Ich möchte auf dem Smartphone mit Android 8.0 keinen Downgrade durchführen (wenn's schief ginge, würde mich meine Frau verprügeln 😎).
 
Kann dein Server auch zwei Geräte gleichzeitig bedienen?
ich glaube nicht.
 
Abgesehen davon, dass der Server derart implementiert ist, dass mehrere Clients gleichzeitig Verbindung zu ihm aufnehmen können, findet der Test immer mit nur einer Verbindung statt.

Hier noch ein Ausschnitt aus dem Client;:

Code:
 public class MyClientTask extends AsyncTask<Void, Void, Void> {
        String dstAct;
        Integer doact;
        String response = "";
        String response1 = "";

        MyClientTask(int act) { // Konstruktor, wird beim Instanzieren (new) aufgerufen
            dstAct = Integer.toString(act);
            doact = act;
            InvokedAsync +=1;
        }

        @Override
        //protected Void doInBackground(Void... arg0) {
        protected Void doInBackground(Void... arg0) {
            InvokedBackground +=1;

            Socket socket = null;
            DataOutputStream dataOutputStream = null;
            DataInputStream dataInputStream = null;
            String s;

            try {
                socket = new Socket(ServerIP, ServerPort);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream.writeUTF(dstAct);
                response1 = dataInputStream.readUTF();
                String[] res = response1.split("%");
                response = res[1];
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                textInfo.setText("");
                firstCall = false;
                s = "Server Host unbekannt\nUnknownHostException: " + e.toString();
                s.trim();
                //response = ClientInfo0 + s;
                response = ClientInfo0 + "Server Host unbekannt";
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                textInfo.setText("");
                firstCall = false;
                s = "Server nicht erreichbar\nIOException: " + e.toString();
                s.trim();
                //response = ClientInfo0 + s;
                response = ClientInfo0 + "Server nicht erreichbar";
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if (dataOutputStream != null) {
                    try {
                        dataOutputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if (dataInputStream != null) {
                    try {
                        dataInputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
 
Zuletzt bearbeitet:
Wo oder wie wird den deine ServerIP, ServerPort übertragen, in die doInBackground Methode?
 
Hallo

@swa00 ist ja richtig das ab Android 8 Api 26 (zb. Http,FTP, WebSockets, XMPP, IMAP, SMTP...)
nicht mehr in Klartext übertragen werden.
Zu mindestens mit den Manifest Default Einstellungen.
Wir haben hier eine Socket Verbindung und die ist meiner Meinung, und auch nach einem Test von mir nicht davon betroffen.




Aber das mit deinem

Code:
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(dstAct);

wird nicht gehen da kommt nichts auf der Server Seite an.

und wenn du in der
socket = new Socket(ServerIP, ServerPort);
Zeile hängen bleibst und nach dem Timeout beendet wird.
Wird entweder der Server nicht erreichbar sein oder deine IP und Portnummer ist falsch.

Schreiben und lesen vom Socket in etwa so.
Code:
    PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())),
                        true);
    out.println(dstAct);

    InputStream in = socket.getInputStream();
    BufferedReader buff = new BufferedReader(new InputStreamReader(in));

    while (buff.ready()) {
         System.out.println(buff.readLine());
    }
 
Zuletzt bearbeitet:
Danke für Eure Mühe. Nachdem ich, ohne Änderungen am Code, einige Debug-Versuche durchgeführt habe, lauft die App auf beiden Smartphones. Ist zwar erfreulich, ich mag es trotzdem nicht, wenn mir die Ursache von Phänomenen verborgen bleibt.
Einzige Erklärung für mich: Auswirkung inzwischen erfolgter Updates in Android 8.
 

Ähnliche Themen

K
  • Klax124
Antworten
2
Aufrufe
283
swa00
swa00
H
Antworten
2
Aufrufe
1.673
Hcman
H
M
Antworten
4
Aufrufe
1.324
swa00
swa00
Zurück
Oben Unten