可能な方法の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
'シナリオ:私のnetwork.'上でホストされている2 "政党" があります。パーティーは使用する名前ではありません。 「ローカルネットワーク上に2台のサーバーが稼働しています」さらに、「これらのサーバーの潜在的なクライアントは、どのようにして稼働/使用可能なサーバーを検出できますか?」と言います。 – greenapps
あなたのローカルネットワーク上に(同じPC上に)2台のサーバがある場合(異なるポート?)(同じプロトコル?)それらに接続しようとするだけで、それらが空中にあるかどうかを調べることができます。あなたはそれにどんな問題がありますか?どの接続情報について話していますか? 「タイトル」はどういう意味ですか?ユーザーはそれから何を見ますか? – greenapps
1つのクライアントが2つの異なるサーバーに接続できるようにするにはどのような設定が必要ですか? – greenapps