Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TCP/IP套接字通信无法返回数据_Android_Sockets_Networking_Tcp Ip - Fatal编程技术网

Android TCP/IP套接字通信无法返回数据

Android TCP/IP套接字通信无法返回数据,android,sockets,networking,tcp-ip,Android,Sockets,Networking,Tcp Ip,我目前正在为我的雇主开发一款Android应用程序,该应用程序将链接到现有产品中。该系统是一种运行固件的设备,可使用.NET Windows程序、直接串行通信或控制网页通过串行、以太网或wi-fi进行控制。安卓应用程序旨在自动连接控制网页,这样就可以通过手机控制设备,而无需任何人手动查找IP地址。为了做到这一点,我需要能够找到IP地址,并确定该地址是否对应于这些固件设备之一 本质上,我想做的是运行Android看到的所有IP地址,并将每个地址发送到上面的方法。这个东西应该使用固件命令ping地址

我目前正在为我的雇主开发一款Android应用程序,该应用程序将链接到现有产品中。该系统是一种运行固件的设备,可使用.NET Windows程序、直接串行通信或控制网页通过串行、以太网或wi-fi进行控制。安卓应用程序旨在自动连接控制网页,这样就可以通过手机控制设备,而无需任何人手动查找IP地址。为了做到这一点,我需要能够找到IP地址,并确定该地址是否对应于这些固件设备之一

本质上,我想做的是运行Android看到的所有IP地址,并将每个地址发送到上面的方法。这个东西应该使用固件命令ping地址,并查看返回的内容,以确定地址是否对应于固件设备。我一直在通过发送HOME或GETINFO等命令来实现这一点,当然,这些命令的固件格式是正确的,如果有任何东西被发送回来,我会将它们与预期的响应进行比较。像home这样的命令也有引起物理响应的好处,因此我们知道在没有微芯片调试器的情况下,是否至少收到了该命令

目前,我有正确的地址硬编码和发送到这个方法。我知道应用程序可以使用与URL相同的地址成功加载网页控件,因此它必须正确,连接必须良好,但与设备的直接通信不起作用。没有观察到任何物理响应,也没有返回任何信息。输入流只是超时并返回-1。最让我难堪的是,据我所知,我发送信息的方式与.NET Windows控件完全相同,但它不起作用

还有一点需要注意:我知道将IP地址字符串作为主机名发送到套接字构造函数可能不起作用,但是由于没有抛出UnknownHostException,我知道套接字可以将其解析为IP地址。对吗

我的代码如下:

 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。如果地址不可路由,则无法继续。