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

时间:2012-06-06 16:04:38

标签: android sockets networking tcp-ip

我目前正在开发一款Android应用,可以链接到我的雇主的现有产品中。该系统是运行固件的设备,可通过串行,以太网或Wi-Fi使用.NET Windows程序,直接串行通信或控制网页进行控制。 Android应用程序旨在自动连接控制网页,以便设备可以从手机控制,而无需任何人手动查找IP地址。为此,我需要能够找到IP地址并确定地址是否与其中一个固件设备相对应。

基本上我想要做的是运行Android看到的所有IP地址,并将每个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;

感谢您提供任何帮助,我真的很感激!

1 个答案:

答案 0 :(得分:0)

同意我应该在套接字上调用isReachable只是为了验证目的,所以感谢提示!然而,事实证明问题是设备没有在端口80上进行通信,所以我有错误端口这一事实肯定是问题的根源。无论如何,谢谢你的建议。