Соединение между Android и Java-сервером с помощью службы обнаружения сети - PullRequest
0 голосов
/ 06 мая 2018

Я работаю над соединением между приложением для Android и сервером в Java, я использую Jmdns на сервере и Discover Network Service на Android для выполнения связи. Однако Android постоянно ищет сервис для подключения и никогда не находит мой сервис. Оба находятся в одной сети (не localhost).

Я взял в качестве примера ответ на вопрос здесь: обмен данными между сервером Java и клиентом Android с использованием обнаружения сетевых служб

Код сервера

public class Server {

public static String mServiceName = "NsdApp";
public static final String SERVICE_TYPE = "_http._tcp.";

static ServerSocket mServerSocket;


public static void main(String[] args) throws IOException {

    System.out.println("START");

try {
    mServerSocket = new ServerSocket(0);
} catch (IOException e) {
    System.out.println("ServerSocket(0) FAILED");
}

int mPort = mServerSocket.getLocalPort();

JmDNS jmdns = JmDNS.create();
ServiceInfo info = ServiceInfo.create(SERVICE_TYPE, mServiceName, mPort, "B");
jmdns.registerService(info);

System.out.println("REGISTERED");

jmdns.close();

Thread mReceiveMessage = new Thread(new ReceiveMessage());
mReceiveMessage.start();

System.out.println("END"); }

public static class ReceiveMessage implements Runnable {

public void run() {
    System.out.println("WAITING_FOR_MESSAGE");
    try {

        Socket clientSocket = mServerSocket.accept(); 
        InputStreamReader inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
        String message = bufferedReader.readLine();
        System.out.println(message);

        bufferedReader.close();
        inputStreamReader.close();
        clientSocket.close();
        System.out.println("END_THREAD");

    } catch (IOException ex) {
        System.out.println("Problem in message reading");
    } } } }

Код клиента

    public class MainActivity extends Activity {

public static final String TAG = "NSD_DISCOVER";
public static final String SERVICE_TYPE = "_http._tcp.";
NsdManager.DiscoveryListener mDiscoveryListener;
NsdManager.ResolveListener mResolveListener;
NsdManager mNsdManager;
int port;
InetAddress host;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.v(TAG, "onCreate");

    mNsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
    initializeResolveListener();
    initializeDiscoveryListener();
    mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}


public void initializeDiscoveryListener() {
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onDiscoveryStarted(String regType) {
            Log.v(TAG, "onDiscoveryStarted Service discovery started");
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            if (!service.getServiceType().equals(SERVICE_TYPE)) {
                Log.v(TAG, "onServiceFound Unknown Service Type: " + service.getServiceType());
            } else {
                Log.v(TAG, "onServiceFound Known Service Type: " + service.getServiceType());
                mNsdManager.resolveService(service, mResolveListener);
            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            Log.e(TAG, "service lost" + service);
        }

        @Override
        public void onDiscoveryStopped(String serviceType) {
            Log.i(TAG, "Discovery stopped: " + serviceType);
        }

        @Override
        public void onStartDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }

        @Override
        public void onStopDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }
    };
}


public void initializeResolveListener() {
    mResolveListener = new NsdManager.ResolveListener() {

        @Override
        public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
            Log.e(TAG, "onResolveFailed Resolve failed" + errorCode);
        }

        @Override
        public void onServiceResolved(NsdServiceInfo serviceInfo) {
            Log.v(TAG, "onServiceResolved Resolve Succeeded. " + serviceInfo);
            port = serviceInfo.getPort();
            host = serviceInfo.getHost();

            SendMessage sendMessageTask = new SendMessage();
            sendMessageTask.execute();
        }
    };
}


private class SendMessage extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {

            Socket client;
            PrintWriter printwriter;

            client = new Socket(host, port); 
            printwriter = new PrintWriter(client.getOutputStream(), true);
            printwriter.write("hello world"); 

            printwriter.flush();
            printwriter.close();
            client.close(); 

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...