2017-05-05 4 views
0

私はアンドロイド開発の分野では比較的新しいので、オンラインでは何も見つかりませんでした。ローカルサーバーの一覧を表示するにはどうすればいいのでしょうか。アンドロイドでローカルサーバーを表示するには?

シナリオ: 私のネットワークには2つの "パーティー"がホストされています。私はこれらの「パーティー」のタイトルをリストで見て、接続するものを選択したいと思います。

私は、ホストとクライアントの間でデータを送受信するために接続を確立する必要があることを理解していますが、潜在的なクライアントが接続するためにホストから接続情報を受信できるようにしたいと考えています。

+0

'シナリオ:私のnetwork.'上でホストされている2 "政党" があります。パーティーは使用する名前ではありません。 「ローカルネットワーク上に2台のサーバーが稼働しています」さらに、「これらのサーバーの潜在的なクライアントは、どのようにして稼働/使用可能なサーバーを検出できますか?」と言います。 – greenapps

+0

あなたのローカルネットワーク上に(同じPC上に)2台のサーバがある場合(異なるポート?)(同じプロトコル?)それらに接続しようとするだけで、それらが空中にあるかどうかを調べることができます。あなたはそれにどんな問題がありますか?どの接続情報について話していますか? 「タイトル」はどういう意味ですか?ユーザーはそれから何を見ますか? – greenapps

+0

1つのクライアントが2つの異なるサーバーに接続できるようにするにはどのような設定が必要ですか? – greenapps

答えて

0

可能な方法の1つは、サーバーに特定のポートでUDPパケットをブロードキャストさせ、別のポートで受信TCP接続を待機させることです。クライアントは特定のポートをリッスンし、サーバーのリストを更新します。サーバーを選択する際、クライアントは別のポートのサーバーとTCP接続を確立する必要があります。

サンプルUDPサービスリスナー

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

これは非常に役に立ちます。しかし、私が混乱している構造についての1つのこと:誰が近くのパーティ情報を収集しているこのサーバーのホストでしょうか? –

+0

あなたの質問が正しく理解されているかどうか分かりません。サーバーはローカルサーバーです。 Android Appsとして書かれていません。クライアントはアンドロイドアプリになります。上記のコードはアンドロイドアプリ内にあります。サービスによって送信された意図を聞く活動が必要です。 – crashOveride

+0

問題を解決する場合は、答えを受け入れます。 – crashOveride

関連する問題