2017-05-05 8 views
0

Ich bin relativ neu auf dem Gebiet der Android-Entwicklung und stoße auf eine Frage, die ich online nicht finden kann. Ich frage mich, was der beste Weg wäre, eine Liste der lokalen Server anzuzeigen.Wie lokale Server auf Android anzeigen?

Szenario: Es gibt 2 "Parteien" in meinem Netzwerk gehostet. Ich möchte den Titel dieser "Parteien" in einer Liste sehen und wählen Sie eine, um sich zu verbinden.

Ich verstehe, dass zuerst eine Verbindung hergestellt werden muss, um Daten zwischen einem Host und einem Client zu senden, aber ich möchte für einen potenziellen Client Verbindungsinformationen von einem Host erhalten, um eine Verbindung herzustellen.

+0

'Szenario: Es gibt zwei "Parteien" auf meinem Fernsehnetz angeschlossen gehostet. Party ist kein Name, der verwendet werden soll. Ich denke, Sie würden sagen: "Es gibt zwei Server, die in meinem lokalen Netzwerk laufen". Und weiter: "Wie kann ein potenzieller Client eines dieser Server herausfinden, welche Server laufen/verfügbar sind?". – greenapps

+0

Wenn nur zwei Server in Ihrem lokalen Netzwerk (auf demselben PC?) (Verschiedene Ports?) (Dasselbe Protokoll?) Laufen, können Sie einfach versuchen, eine Verbindung zu ihnen herzustellen, um zu sehen, ob sie in der Luft sind. Welches Problem hast du damit? Über welche Verbindungsinformationen sprichst du? Was meinst du mit "Titel"? Was würde der Benutzer dann sehen? – greenapps

+0

Welche Konfiguration haben Sie, dass ein Client in der Lage sein sollte, eine Verbindung zu zwei verschiedenen Servern herzustellen? – greenapps

Antwort

0

Eine Möglichkeit besteht darin, die Server dazu zu bringen, UDP-Pakete an einem bestimmten Port zu senden und eingehende TCP-Verbindungen an einem anderen Port abzuhören. Der Client würde den bestimmten Port abhören und die Liste der Server aktualisieren. Bei der Auswahl eines Servers sollte der Client eine TCP-Verbindung mit dem Server an einem anderen Port herstellen.

Beispiel UDP-Dienst Zuhörer

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketTimeoutException; 
import java.net.UnknownHostException; 

import org.apache.http.util.ExceptionUtils; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 


/* 
* Linux command to send UDP: 
* #socat - UDP-DATAGRAM:192.168.1.255:11111,broadcast,sp=11111 
*/ 
public class UDPListenerService extends Service { 
static String UDP_BROADCAST = "UDPBroadcast"; 

//Boolean shouldListenForUDPBroadcast = false; 
DatagramSocket socket; 

private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception { 
    byte[] recvBuf = new byte[15000]; 
    if (socket == null || socket.isClosed()) { 
     socket = new DatagramSocket(port, broadcastIP); 
     socket.setBroadcast(true); 
    } 
    //socket.setSoTimeout(1000); 
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
    Log.e("UDP", "Waiting for UDP broadcast"); 
    socket.receive(packet); 

    String senderIP = packet.getAddress().getHostAddress(); 
    String message = new String(packet.getData()).trim(); 

    Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message); 

    broadcastIntent(senderIP, message); 
    socket.close(); 
} 

private void broadcastIntent(String senderIP, String message) { 
    Intent intent = new Intent(UDPListenerService.UDP_BROADCAST); 
    intent.putExtra("sender", senderIP); 
    intent.putExtra("message", message); 
    sendBroadcast(intent); 
} 

Thread UDPBroadcastThread; 

void startListenForUDPBroadcast() { 
    UDPBroadcastThread = new Thread(new Runnable() { 
     public void run() { 
      try { 
       InetAddress broadcastIP = InetAddress.getByName("172.16.238.255"); //172.16.238.42 //192.168.1.255 
       Integer port = 11111; 
       while (shouldRestartSocketListen) { 
        listenAndWaitAndThrowIntent(broadcastIP, port); 
       } 
       //if (!shouldListenForUDPBroadcast) throw new ThreadDeath(); 
      } catch (Exception e) { 
       Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage()); 
      } 
     } 
    }); 
    UDPBroadcastThread.start(); 
} 

private Boolean shouldRestartSocketListen=true; 

void stopListen() { 
    shouldRestartSocketListen = false; 
    socket.close(); 
} 

@Override 
public void onCreate() { 

}; 

@Override 
public void onDestroy() { 
    stopListen(); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    shouldRestartSocketListen = true; 
    startListenForUDPBroadcast(); 
    Log.i("UDP", "Service started"); 
    return START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

}

Code gist

+0

Dies ist sehr hilfreich. Eine Sache über die Struktur bin ich jedoch verwirrt: wer wäre der Gastgeber dieses Servers, der die nahe gelegenen Parteiinformationen sammelt? –

+0

Ich bin mir nicht sicher, ob ich deine Frage richtig verstanden habe. Server sind die lokalen Server. Nicht als Android Apps geschrieben. Der Client wird eine Android App sein. Der obige Code wird in der Android-App enthalten sein. Es sollte eine Aktivität auf die Absichten hören, die vom Dienst gesendet werden. – crashOveride

+0

Akzeptieren Sie die Antwort, wenn Sie Ihr Problem lösen. – crashOveride

Verwandte Themen