使用网络服务发现连接android和java服务器

时间:2018-05-06 20:41:24

标签: java android server

我正在研究java应用程序和java服务器之间的连接,我在服务器上使用Jmdns,在android上使用Discover Network Service来执行通信。然而,Android一直在寻找连接服务,从不找到我的服务。两者都在同一个网络上(不是localhost)。

我以这里回答的问题为例: communication between Java server and Android client using Network Service Discovery

服务器代码

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;
    }
}

0 个答案:

没有答案