Android Socket.connect() wiederholt sich mehrmals?

Noahscript

Aktives Mitglied
Hallo zusammen,

kann es sein, dass unter bestimmten Voraussetzungen Socket.connect() unendlich immer wieder ausgeführt wird ohne, dass man im ersten Augenblick weiß warum?

Ich möchte nämlich, dass es asynchronisch läuft. Deswegen verwende ich ganz normal Executor. Oder zumindest glaube ich das...

Ich habe auch eine try-catch-Verschachtelung.

Und ich habe auch noch eine while-Schleife, aber die ist außerhalb von der connect()-Methode und ist leer.

Woher weiß ich das die connect()-Methode immer wieder ausgeführt wird? Weil wenn sie ausgeführt wird, lasse ich in einem editText eine entsprechende Nachricht schreiben. Und diese Nachricht erscheint mir zu oft.

Das ist der Code:
Java:
socket.socket().connect(adresse, 1000);

Ich hoffe, dass es nicht so ist, dass die Verbindung nach einer Sekunde wieder hergestellt wird, auch wenn sie bereits hergestellt wurde...

Vielen Dank!!
 

Oneixee5

Top Contributor
Die Methode connect verbindet diesen Socket mit dem Server mit einem angegebenen Timeout-Wert. Ein Timeout von Null wird als unendlicher Timeout interpretiert. Die Verbindung wird dann blockiert, bis sie aufgebaut wird oder ein Fehler auftritt. Kommt die Verbindung nicht innerhalb des Zeitraums der als Timeout-Wert vorgegeben ist zustande, wird eine Fehler ausgegeben. Der Wert 1000 bedeutet also nicht, das jede Sekunde eine neue Verbindung aufgebaut wird.
 

LimDul

Top Contributor
Der Code wird nicht von sich aus mehrfach ausgeführt, der Fehler muss daher bei dir liegen.

Zwei Ursachen:
* Direkter Fehler im Aufruf (dafür müsste man den gesamten Code sehen)
* Fehlerhaftes Verständnis von Android, da kenn ich mich zwar nicht aus - aber Android ist an Stellen mit Sicherheit Event gesteuert, und wenn man auf das falsche Event reagiert, kann sowas auch passieren.
 

Noahscript

Aktives Mitglied
Direkter Fehler im Aufruf (dafür müsste man den gesamten Code sehen)
Hier ist etwas mehr Code. Ich zeige zunächst nicht alles, damit man den Überblick nicht verliert und "überflutet" wird.

Hier ist mehr Code, den ich relevant finden würde:
Java:
socket = SocketChannel.open();
    socket.socket().connect(addr, 1000);

    socket.configureBlocking(true);

    while (!socket.finishConnect()) {

    }
    running = true;
    if (!reader.isAlive()) {
        reader.start();
    }
    
    updateTimer.startTimer();
running = true; bedeutet eine aktive Verbindung zum Server.
updateTimer.startTimer(); bedeutet, dass in einem Intervall von ein paar Minuten ein Paket zum Server gesendet werden sollte um die Verbindung zu erhalten.

Könnt ihr daraus ein Verdacht schöpfen?

Ansonsten hier der gleiche Code, nur halt mit irrelevanten Ergänzungen (denke ich):
Java:
socket = SocketChannel.open();
                            socket.socket().connect(addr, 1000);
                            roomText = param1;
                            saveColoredText(getString(R.string.verbindend), Color.BLUE);
                            try {
                                s.room.setText(param1);
                                appendColoredText(s.chat,getString(R.string.verbindend), Color.BLUE);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            
                            socket.configureBlocking(true);

                            while (!socket.finishConnect()) {

                            }
                            running = true;
                            if (!reader.isAlive()) {
                                reader.start();
                            }
                            P2 pkg = new P2(user.getGuid(), (short) user.getFilecount(), (short) user.getDataport(), user.getNodeIp(), (short) user.getNodePort(), user.getLinetype(), user.getUsername(), CLIENT_VERSION, user.getPrivateIp(), user.getPublicIp(), user.getBrowsable(), user.getUploads(), user.getMaxUploads(), user.getQueued(), user.getAge(), user.getGender(), user.getCountry(), user.getRegion());
                            send(pkg);
                            updateTimer.startTimer();

Hier sieht man das hier:
Java:
roomText = param1;
                            saveColoredText(getString(R.string.verbindend), Color.BLUE);
                            try {
                                s.room.setText(param1);
                                appendColoredText(s.chat,getString(R.string.verbindend), Color.BLUE);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
Der Name des Chatraumes (in einem String) und die Nachricht, dass eine Verbindung aufgebaut wird (in einem SpannableString) werden gespeichert. Gleichzeitig versucht man, diese beiden Texte gleich in den entsprechenden editText zu setzen bzw. hinzuzufügen.

Und hier:
Java:
P2 pkg = new P2(user.getGuid(), (short) user.getFilecount(), (short) user.getDataport(), user.getNodeIp(), (short) user.getNodePort(), user.getLinetype(), user.getUsername(), CLIENT_VERSION, user.getPrivateIp(), user.getPublicIp(), user.getBrowsable(), user.getUploads(), user.getMaxUploads(), user.getQueued(), user.getAge(), user.getGender(), user.getCountry(), user.getRegion());
                            send(pkg);
wird gleich, nachdem die Verbindung aufgebaut wurde, ein Paket zur Authentifizierung gesendet.

Wie gesagt, an dieser Stelle für mich nicht so relevant, aber vielleicht seht ihr was, was ich nicht sehe...



Fehlerhaftes Verständnis von Android, da kenn ich mich zwar nicht aus - aber Android ist an Stellen mit Sicherheit Event gesteuert, und wenn man auf das falsche Event reagiert, kann sowas auch passieren.
Ich sehe da, soweit mir bewusst ist, kein besonderer Event.

Diese Methode wird jedoch in einem Executor ausgeführt.


Vielen Dank!!
 

LimDul

Top Contributor
Ich hab mal in den anderen Thread, wo den Code hochgeladen hast, reingeschaut. Der Fehler ist dass du da ein new Thread(this); erzeugt.

Das heißt, während der Ausführung des Code im Executor erzeugt einen neuen Thread (der eigentlich zum lesen der Daten aus dem Socket dem Namen nach dienen soll) mit Referenz auf den gerade ausgeführten Code im Executor. Das heißt, sobald du den Thread startest, wird der gesamte Code nochmal durchlaufen.
 

Neue Themen


Oben