2016-08-04 26 views
1

Ich mache eine App, die Menschen ermöglicht, Dateien zwischen ihnen zu teilen. Im Moment versuche ich nur, Text zu teilen, aber bald werde ich es in Dateien ändern. Aber ich habe einige Probleme beim Erstellen der Socket-Verbindung (die beiden Geräte sind bereits über Hotspot verbunden: einer von ihnen ist der Hotspot; der andere verbindet sich mit ihm).Android - Senden von Daten zwischen Server und Client

Ich würde eine normale Java-Socket-Verbindung machen, aber dann lese ich hier, dass, wenn das Telefon in den Ruhezustand geht, die Sockets schließen/Timeout. Die Lösung, die Sie für dieses Problem empfahlen, war Intent Services.

Ich habe zwei IntentServices, einen ClientCommService und einen ServerCommService erstellt. Ich setze das in der onHandleIntent() Methode voraus, ich sollte die Sockets erstellen und anfangen zu hören/warten auf alle eingehenden Nachrichten (erzeuge die Stream Objekte und starte die Sockets). Mein Problem ist, dass ich auch Nachrichten senden möchte und ich weiß nicht, wo ich die Logik setzen sollte, um eine Nachricht this.out.writeObject() zu senden. Dies ist wichtig, weil ich eine bidirektionale Kommunikation erstellen möchte, die von jedem Mitglied (Server oder Client) gestartet werden kann.

Frage 2: Einige Ansätze, die ich hier auf Stackoverflow sah, erstellt nur einen IntentService für den Server. Warum?

Antwort

0

Wenn Sie Ihren Dienst auch dann noch am Leben erhalten möchten, wenn Ihr Telefon nicht mehr aktiv ist, müssen Sie Service anstelle von IntentService erstellen.

Auch müssen Sie Ihren Service als STICKY Service halten. Denken Sie daran,

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    return START_STICKY; 
} 

, dass dieser Dienst auf Haupt-Thread ausgeführt wird, so dass Sie die Pflege Ihrer Code-Thread wird nicht unterbrechen UI nehmen müssen.

Sie können Ihre Client/Server-Logik in onStartCommand Methode setzen.

+0

So funktioniert der IntentService nicht? Übrigens, wo sollte ich die Sendelogik setzen? Ich möchte eine bidirektionale Verbindung .. Vielen Dank für Ihre Hilfe –

+0

IntentService Management seiner Warteschlange, so wird es FIFO-System, aber ich denke, in Ihrem Fall könnte es mehr als eine Operation wird da sein. Sie können Ihre Client-Server-Logik innerhalb der onStartCommand-Methode schreiben, da die Client- und Serverlogik unabhängig voneinander aufrufen. – dhams

+0

Update: Ich kann die Logik nicht auf den onStartCommand setzen, weil es mir die Ausnahme networkonmainthread geben wird. Ich habe es geschafft, es funktioniert, aber jetzt habe ich andere Probleme, mit der Tatsache, dass, da ich 2 Threads in einem Dienst (die zu unterschiedlichen Zeiten ausgelöst werden), habe ich Probleme mit Socket bereits in Verwendung. –

Verwandte Themen