建立Android和非Android设备之间的通信

时间:2014-07-02 05:29:00

标签: android sockets communication

我希望在两个设备之间建立通信,一个Android和另一个非Android。另一个设备通过搜索套接字客户端来运行,并且设备本身用作套接字服务器。它确实获得了一个IP地址和一个端口号,现在在我的应用程序中,我希望该程序能够搜索空套接字,看起来普通的套接字编程对此来说还不够好。我可能需要在其中包含mDNS或NSD类型的东西。

任何有提示的人,如何完成任务?

1 个答案:

答案 0 :(得分:3)

编写Android服务器与标准Java实现没有什么不同。

 ServerSocket serverSocket = new ServerSocket(SERVERPORT);
 while (true) {
      Socket newClient = serverSocket.accept(); // block until new connection
      <IO with newClient>
 }

至于IO部分:你可以做标准的阻塞IO,这可能会  要求你产生额外的线程,或者你可以使用Android nio API

现在:

serverSocket代码必须在专用线程上运行

如果您计划长时间运行的服务器,您可能希望将其放入  专注的服务。由活动直接生成的线程可以由Android交换 在他们的活动转移到背景之后。

在这方面,服务要好得多。但服务最终也会下降。

因此,如果服务器对您的系统非常重要,那么您需要一种方法  告诉Android在资源不足时不要杀死它。做到这一点的方法是宣布您的服务  作为foreground service

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);

前台服务比标准服务更稳定,但它们并不妨碍Android进入 睡觉,睡觉时无效。如果你真的需要你的应用来防止设备睡觉, 你需要获得一个wake lock。唤醒锁在电池消耗方面非常昂贵。小心处理。

至于客户端代码(我假设是Java客户端) - 它看起来像这样:

Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
while (true) {
   PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
   <write to peer>
   socket.close();
}

最后一个棘手的问题:你必须找到一种传递服务器IP地址的方法 对同行。请记住 - 这是移动设备和您正在使用的网络 可以定期改变。要获取服务器IP地址,请使用:

String getDeviceIpAddr() {
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
        NetworkInterface network = en.nextElement();
        for (Enumeration<InetAddress> addr = network.getInetAddresses(); addr.hasMoreElements();) {
             InetAddress inetAddress = addr.nextElement();
             if (!inetAddress.isLoopbackAddress()) {
                 return inetAddress.getHostAddress().toString();
             }
        }
    }
}

你需要一些方法将它传递给服务器的客户端。许多人使用中继服务器。