使用网络服务发现在Java服务器和Android客户端之间进行通信
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用网络服务发现在Java服务器和Android客户端之间进行通信,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5297字,纯文字阅读大概需要8分钟。
内容图文
我正在构建一个Java服务器应用程序(在PC上运行),它使用JmDNS将自己注册到本地网络,以及一个应该使用Network Service Discovery发现java服务器的Android客户端应用程序.
当我首先运行Android应用程序,然后运行java服务器时,应用程序成功发现注册的java服务器.
但是当我第一次运行服务器然后运行Android应用程序时,onDiscoveryStarted方法被调用但是onServiceFound方法从未被触发 – android应用程序没有发现服务器.
这在我看来是一种意想不到的行为.
成功案例:
Android应用日志:
08-24 22:42:06.157 NSD_DISCOVER onCreate
08-24 22:42:06.373 NSD_DISCOVER:onDiscoveryStarted服务发现已启动
08-24 22:42:30.256 NSD_DISCOVER:onServiceFound已知服务类型:_http._tcp.
08-24 22:42:30.293 NSD_DISCOVER:onServiceResolved Resolve Succeeded. name:NsdApp,type:._ http._tcp,host:/10.0.0.2,port:52288
Java服务器日志:
开始
注册
结束
WAITING_FOR_MESSAGE
你好,世界
END_THREAD
失败案例:
Android应用日志:
08-24 22:05:21.690 NSD_DISCOVER:onCreate
08-24 22:05:21.908 NSD_DISCOVER:onDiscoveryStarted服务发现开始了
Java服务器日志:
开始
注册
结束
WAITING_FOR_MESSAGE
服务器代码
public class Server {
public static String mServiceName = "NsdApp";
public static final String SERVICE_TYPE = "_http._tcp.local";
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;
}
}
}
解决方法:
您在注册后立即调用jmdns.close().只要您打开jmdns,您的服务才能被发现.您应该删除该调用以关闭,使您的jmdns变量成为您的类的成员,然后只在您不希望您的服务被发现时才调用close.此外,在关闭jmdns之前调用unregisterAllServices()是一种很好的形式.
内容总结
以上是互联网集市为您收集整理的使用网络服务发现在Java服务器和Android客户端之间进行通信全部内容,希望文章能够帮你解决使用网络服务发现在Java服务器和Android客户端之间进行通信所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。