2016-08-08 22 views
0

Ich mache ein Projekt, bei dem sich 2 Leute über Wifi-Hotspot verbinden (Einer als Hotspot, der andere verbindet ihn per WLAN) und sie können Nachrichten austauschen (ich mache Dateien später).Android Service mögliche Wiederverwendung?

Ich erstellte die Socket-Verbindung mit zwei Diensten (mit zwei Threads innerhalb, eine zum Senden von Informationen, eine andere zum Lesen von Informationen), eine für den Server und eine andere für den Client. Die Kommunikation sollte bidirektional sein und kann von jedem von ihnen gestartet werden und hier habe ich ein Problem.

Grundsätzlich in der Anfang, ich starte den Dienst und starten Sie den Thread zu empfangen (ich eine Aktion festlegen und überprüfen Sie auf der Methode onStartCommand, um zu wissen, welcher Thread erstellt werden). Dann hat eine Person eine Schaltfläche, die, wenn sie sie drückt, eine Nachricht senden kann. Wenn eine Person eine Nachricht sendet, starte ich den Dienst erneut (und setze die Aktion auf SENDEN, damit ich den Thread zum Versenden der Nachricht starten kann).

Das Problem ist, dass, wenn ich den Dienst wieder zu starten (zu senden), ich werde die Ausnahme des Sockets wird bereits verwendet (bereits versucht, die setReuseAddress (true) und es funktioniert nicht). Ich bekomme ein ähnliches Problem für die Streams, sie werden nicht "verwandt" sein (Der Outputstream von einer Seite ist nicht der Korrespondent mit dem Inputstream von der anderen Seite - sie tauschen jedes Mal einen Header aus, wenn sie erstellt werden).

Wie denkst du, ich könnte das lösen? Ich könnte die Streams und den Socket als statisch und überprüfen, ob sie bereits erstellt wurden, aber das scheint nicht zu konsistent. Wenn ihr brauchen, kann ich den Code schreiben, aber es wird Art lange

Antwort

0

einfach sein überprüfen, ob Buchse verwendet oder nicht, und schließen Sie es

private boolean isPortInUse(String host, int port) { 
    // Assume no connection is possible. 
    boolean result = false; 

    try { 
    (new Socket(host, port)).close(); 
    result = true; 
    } 
    catch(SocketException e) { 
    // Could not connect. 
    } 

    return result; 
} 
+0

Das Problem ist, dass ich nicht, dass die Buchse schließen kann, weil ich immer noch auf etwas "hören" möchte, das mir gesendet wird. Wie ich schon sagte, es ist eine bidirektionale Kommunikation und jeder der beteiligten Teile kann mit dem Senden von Daten beginnen. –

+0

Erstellen Sie Socket in OnCreate() und holen Sie sie in OnstartCommand(), so dass immer wenn der Dienst neu starten dann OnstartCommand() aufruft und Sie können den Socket wiederverwenden –

+0

Das ist genau das, was ich getan habe. Vielen Dank für Ihre Hilfe. –