我希望在两个设备之间建立通信,一个Android和另一个非Android。另一个设备通过搜索套接字客户端来运行,并且设备本身用作套接字服务器。它确实获得了一个IP地址和一个端口号,现在在我的应用程序中,我希望该程序能够搜索空套接字,看起来普通的套接字编程对此来说还不够好。我可能需要在其中包含mDNS或NSD类型的东西。
任何有提示的人,如何完成任务?
答案 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();
}
}
}
}
你需要一些方法将它传递给服务器的客户端。许多人使用中继服务器。