Autore Topic: Connettere a server Bonjour  (Letto 427 volte)

Offline lucacasula91

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 Mini
  • Sistema operativo:
    Mac OS X 10.10
Connettere a server Bonjour
« il: 28 Aprile 2015, 18:57:25 CEST »
0
Salve, in una mia app sviluppata per iOS ho creato un gioco sfruttando un server bonjour su un dominio locale.. vorrei estendere la possibilità di gioco anche agli utenti Android per cui ho pensato di avvalermi della classe NsdManager per fare ciò.. di seguito il mio codice:

Codice (Java): [Seleziona]
package com.lucacasula.myapplication;

import android.content.Context;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import java.net.InetAddress;


public class MainActivity extends ActionBarActivity {
    private String SERVICE_NAME = "Dance!";
    private String SERVICE_TYPE = "_dance._tcp.";

    private InetAddress hostAddress;
    private int hostPort;
    private NsdManager mNsdManager;



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

        TAG = "me";
        mNsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
        mNsdManager.discoverServices(SERVICE_TYPE,
                NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    NsdManager.DiscoveryListener mDiscoveryListener = new NsdManager.DiscoveryListener() {

        // Called as soon as service discovery begins.
        @Override
        public void onDiscoveryStarted(String regType) {
            Log.d(TAG, "Service discovery started");
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            // A service was found! Do something with it.
            Log.d(TAG, "Service discovery success : " + service);
            Log.d(TAG, "Host = "+ service.getServiceName());
            Log.d(TAG, "port = " + String.valueOf(service.getPort()));

            if (!service.getServiceType().equals(SERVICE_TYPE)) {
                // Service type is the string containing the protocol and
                // transport layer for this service.
                Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
            } else if (service.getServiceName().equals(SERVICE_NAME)) {
                // The name of the service tells the user what they'd be
                // connecting to. It could be "Bob's Chat App".
                Log.d(TAG, "Same machine: " + SERVICE_NAME);
            } else {
                Log.d(TAG, "Diff Machine : " + service.getServiceName());
                // connect to the service and obtain serviceInfo
                mNsdManager.resolveService(service, mResolveListener);
            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            // When the network service is no longer available.
            // Internal bookkeeping code goes here.
            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);
        }
    };

    NsdManager.ResolveListener mResolveListener = new NsdManager.ResolveListener() {

        @Override
        public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
            // Called when the resolve fails. Use the error code to debug.
            Log.e(TAG, "Resolve failed " + errorCode);
            Log.e(TAG, "serivce = " + serviceInfo);
        }

        @Override
        public void onServiceResolved(NsdServiceInfo serviceInfo) {
            Log.d(TAG, "Resolve Succeeded. " + serviceInfo);

            if (serviceInfo.getServiceName().equals(SERVICE_NAME)) {
                Log.d(TAG, "Same IP.");
                return;
            }

            // Obtain port and IP
            hostPort = serviceInfo.getPort();
            hostAddress = serviceInfo.getHost();
        }
    };


}

sul logcat mi stampa "Service discovery started", quindi suppongo che il le righe di codice sul metodo onCreate() "funzionano" a dovere.. ma dopo non mi stampa nessun servizio.. come se non ne trovasse nemmeno uno.
Il mio dubbio è che magari non trova nessun servizio perché non ho specificato di cercare nella rete locale, come e dove posso specificare che si tratta di un dominio locale?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Connettere a server Bonjour
« Risposta #1 il: 29 Aprile 2015, 10:38:35 CEST »
0
Io ho fatto una cosa diversa ma simile, usando java su desktop e la librera jmdns.
quando creo il mio service listener, come stringa gli do "_workstation._tcp.local.", magari ti manca la parte '.local.' (il punto finale penso sia importante, perchè senza non trova niente).
Nel mio caso non avevo service name, quindi piu di cosi non ti so dire...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline lucacasula91

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 Mini
  • Sistema operativo:
    Mac OS X 10.10
Re:Connettere a server Bonjour
« Risposta #2 il: 29 Aprile 2015, 13:16:10 CEST »
0
Forse ho fatto molta confusione io, l'app iOS sfrutta il framework GCDAsyncSocket.. quindi dovrei usare java.net.socket ?

Offline lucacasula91

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 Mini
  • Sistema operativo:
    Mac OS X 10.10
Re:Connettere a server Bonjour
« Risposta #3 il: 01 Maggio 2015, 21:32:24 CEST »
0
nessuno che mi sappia dare una mano d'aiuto... ?  :-o :-(