2017-05-05 56 views
0

我對android開發領域比較陌生,遇到一個問題,我找不到任何關於在線的問題。我想知道什麼是查看本地服務器列表的最佳方式。如何在Android上查看本地服務器?

場景: 我的網絡上有2個「派對」託管。我想在列表中查看這些「派對」的標題並選擇一個連接。

據我所知,首先必須建立連接才能在主機和客戶端之間發送和接收數據,但我希望潛在客戶端能夠從主機接收連接信息以便連接。

+0

'情景:有2個 「方」 在我network.'被託管。派對不是要使用的名稱。我想你會說:「我的本地網絡上運行着兩臺服務器」。並且還說:「其中一臺服務器的潛在客戶端如何發現哪臺服務器正在運行/可用?」。 – greenapps

+0

如果您的本地網絡上只有兩臺服務器(在同一臺電腦上?)(不同的端口?)(相同的協議?),那麼您可以嘗試連接它們以查看它們是否在空中。你有什麼問題?你在說什麼連接信息? 「標題」是什麼意思?那麼用戶會看到什麼? – greenapps

+0

你有什麼設置,一個客戶端應該能夠連接到兩個不同的服務器? – greenapps

回答

0

一種可能的方法是讓服務器在特定端口上廣播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

這非常有幫助。然而,有一件事我對這個結構感到困惑:誰會成爲收集附近聚會信息的服務器的主機? –

+0

我不確定是否正確理解了您的問題。服務器是本地服務器。不作爲Android應用程序編寫。客戶端將是一個Android應用程序。上面的代碼將在android應用程序中。應該有一項活動傾聽服務發送的意圖。 – crashOveride

+0

如果解決了您的問題,請接受答案。 – crashOveride

相關問題