خرید بک لینک

Vote count: 0

Long story short, my problem is the same of that question.

Even if I dont close the jmNDS service my client only discover the server when it start first. If not it only discover my printer (That should have another protocol by the way)

Server.java

public class Server {   
    public static void main(String[] args) {        
        System.out.println("--- Starting Enjoy Your Meal Server Service ---");      
        Thread serverThread = new Thread(new ClientCoection());       
        serverThread.start();   
    }
}

ClientCoection.java

public class ClientCoection implements Ruable {

    private static final String mServiceName = "EnjoyYourMeal";
    private static final String SERVICE_TYPE = "_http._tcp.local";

    private ServerSocket mServerSocket;
    private JmDNS jmDNS;

    public ClientCoection() {
        try {
            System.out.println("-- Creating Server Socket...");
            mServerSocket = new ServerSocket(0);    // Take the next port available
        } catch (IOException e) {
            System.err.println("Error while creating Server Socket");
            System.err.println(e.getMessage());
        }

        int mPort = mServerSocket.getLocalPort();   // Get the port taken

        System.out.println("-- Creating jmDNS service...");
        try {
            jmDNS = JmDNS.create();     // Create jmDNS service
        } catch (IOException e) {
            System.err.println("Error while creating jmDNS service");
            System.err.println(e.getMessage());
        }

        System.out.println("-- Creating jmDNS info...");
        ServiceInfo info = ServiceInfo.create(SERVICE_TYPE, mServiceName, mPort, "B");  // Create info about the service

        System.out.println("-- Registering jmDNS service...");
        try {
            jmDNS.registerService(info);    // Register the service
        } catch (IOException e) {
            System.err.println("Error while registering jmDNS service");
            System.err.println(e.getMessage());
        }
        System.out.println("-- jmDNS service registered: ntHost: " + jmDNS.getHostName() + "ntPort: " + mPort);
    };

    @Override
    public void run() {

        Socket clientSocket;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;

        System.out.println("-- Waiting for message...");
        try {
            clientSocket = mServerSocket.accept();
            System.out.println("Message received");
            inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader);

            System.out.println(bufferedReader.readLine());

            bufferedReader.close();
            inputStreamReader.close();
            clientSocket.close();
            jmDNSClose();

            System.out.println("-- End Server Service");    
        } catch (IOException e) {
            System.err.println("Error while accepting client coection");
            System.err.println(e.getMessage());
        }       
    }

    private void jmDNSClose() throws IOException {
        System.out.println("Unregistering jmDNS service...");
        jmDNS.unregisterAllServices();
        jmDNS.close();
    }
}

Client

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "NSD_DISCOVER";
    public static final String SERVICE_TYPE = "_http._tcp.";
    public static final String SERVICE_NAME = "EnjoyYourMeal";

    NsdManager mNsdManager;
    NsdManager.DiscoveryListener mDiscoveryListener;
    NsdManager.ResolveListener mResolveListener;

    int port;
    InetAddress host;

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

        Log.d(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 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);
            }

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

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

            @Override
            public void onServiceFound(NsdServiceInfo serviceInfo) {
                Log.d(TAG, "Service discovery success: " + serviceInfo);
                if (!serviceInfo.getServiceType().equals(SERVICE_TYPE)) {
                    Log.d(TAG, "onServiceFound Unknown Service Type: " + serviceInfo.getServiceType());
                } else if (    serviceInfo.getServiceName().contains(SERVICE_NAME)) {
                    mNsdManager.resolveService(serviceInfo, mResolveListener);
                }
            }

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

    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 (IOException e) {
                e.printStackTrace();
            }

            retu null;
        }
    }
}

On Fail:

Android Monitor

D/NSD_DISCOVER: onCreate
D/NSD_DISCOVER: onDiscoveryStarted Service discovery started
D/NSD_DISCOVER: Service discovery success: name: Canon MG3500 series, type: _http._tcp., host: null, port: 0

Java Console

--- Starting Enjoy Your Meal Server Service ---
-- Creating Server Socket...
-- Creating jmDNS service...
-- Creating jmDNS info
-- Registering jmDNS service...
-- jmDNS service registered: 
    Host: Camera-Fede.local.
    Port: 58441
-- Waiting for message...

On success

Android Monitor

D/NSD_DISCOVER: onCreate
D/NSD_DISCOVER: onDiscoveryStarted Service discovery started
D/NSD_DISCOVER: Service discovery success: name: Canon MG3500 series, type: _http._tcp., host: null, port: 0
D/NSD_DISCOVER: Service discovery success: name: EnjoyYourMeal, type: _http._tcp., host: null, port: 0
D/NSD_DISCOVER: onServiceFound Know Service Name: EnjoyYourMeal
V/NSD_DISCOVER: onServiceResolved Resolve Succeeded. name: EnjoyYourMeal, type: ._http._tcp, host: /192.168.1.101, port: 58441

Java Console

--- Starting Enjoy Your Meal Server Service ---
-- Creating Server Socket...
-- Creating jmDNS service...
-- Creating jmDNS info
-- Registering jmDNS service...
-- jmDNS service registered: 
    Host: Camera-Fede.local.
    Port: 58441
-- Waiting for message...
Message received
hello world
Unregistering jmDNS service...
-- End Server Service

asked 34 secs ago

- - , .

برچسب: نویسنده: استخدام کار تاريخ: پنجشنبه 22 بهمن 1394 ساعت: 8:08

صفحه بندی