Android TCP/IP套接字通信无法返回数据
我目前正在为我的雇主开发一款Android应用程序,该应用程序将链接到现有产品中。该系统是一种运行固件的设备,可使用.NET Windows程序、直接串行通信或控制网页通过串行、以太网或wi-fi进行控制。安卓应用程序旨在自动连接控制网页,这样就可以通过手机控制设备,而无需任何人手动查找IP地址。为了做到这一点,我需要能够找到IP地址,并确定该地址是否对应于这些固件设备之一 本质上,我想做的是运行Android看到的所有IP地址,并将每个地址发送到上面的方法。这个东西应该使用固件命令ping地址,并查看返回的内容,以确定地址是否对应于固件设备。我一直在通过发送HOME或GETINFO等命令来实现这一点,当然,这些命令的固件格式是正确的,如果有任何东西被发送回来,我会将它们与预期的响应进行比较。像home这样的命令也有引起物理响应的好处,因此我们知道在没有微芯片调试器的情况下,是否至少收到了该命令 目前,我有正确的地址硬编码和发送到这个方法。我知道应用程序可以使用与URL相同的地址成功加载网页控件,因此它必须正确,连接必须良好,但与设备的直接通信不起作用。没有观察到任何物理响应,也没有返回任何信息。输入流只是超时并返回-1。最让我难堪的是,据我所知,我发送信息的方式与.NET Windows控件完全相同,但它不起作用 还有一点需要注意:我知道将IP地址字符串作为主机名发送到套接字构造函数可能不起作用,但是由于没有抛出UnknownHostException,我知道套接字可以将其解析为IP地址。对吗 我的代码如下:Android TCP/IP套接字通信无法返回数据,android,sockets,networking,tcp-ip,Android,Sockets,Networking,Tcp Ip,我目前正在为我的雇主开发一款Android应用程序,该应用程序将链接到现有产品中。该系统是一种运行固件的设备,可使用.NET Windows程序、直接串行通信或控制网页通过串行、以太网或wi-fi进行控制。安卓应用程序旨在自动连接控制网页,这样就可以通过手机控制设备,而无需任何人手动查找IP地址。为了做到这一点,我需要能够找到IP地址,并确定该地址是否对应于这些固件设备之一 本质上,我想做的是运行Android看到的所有IP地址,并将每个地址发送到上面的方法。这个东西应该使用固件命令ping地址
private class NetworkTask extends AsyncTask<String, Boolean, Boolean> {
protected Boolean doInBackground(String... addr){
try {
String message = "<FHGETHUBINFO>";
byte[] input = new byte[8];
//addr is an array of string parameters containing a single IP address string. E.g. addr[0]=”192.168.199.108”
Socket s = new Socket(addr[0],80);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
out.write(message.getBytes());
Log.v(TAG, "output sent. Waiting for input.");
InputStream in = s.getInputStream();
//Skip the exclamation mark and newline. Verified that nothing is received even without a skip.
in.skip(2);
int numBytes = in.read(input,0,8);
Log.v(TAG, "Input received: "+numBytes);
String st = input.toString();
//Close connection
s.close();
if(st != "HUB INFO"){
return true;
}
else{
return false;
}
}
catch (UnknownHostException e) {
Log.v(TAG,"UnknownHostException: "+e.getMessage());
e.printStackTrace();
}
catch (IOException e) {
Log.v(TAG,"IOException: "+e.getMessage());
e.printStackTrace();
}
return false;
谢谢你的帮助,我真的很感激 同意我应该在套接字上调用isReachable只是为了验证,所以谢谢你的提示!然而,问题是设备没有在端口80上通信,所以我的端口错误这一事实肯定是问题的根源。无论如何,感谢您的建议。您正在向套接字传递一个字符串。您可能应该在创建套接字后在套接字上调用isReachable。如果地址不可路由,则无法继续。