【问题标题】:Android socket programming without WIFi connection无WIFI连接的Android socket编程
【发布时间】:2012-01-31 13:51:09
【问题描述】:

我编写了一个应用程序来远程启动我的服务器。启用 WiFi 后,该应用程序在模拟器和我的智能手机(HTC 渴望,Android 2.2)上都可以正常运行。 但是在禁用 WiFi 时它不起作用。

在重新启动之前,我首先检查它是否已经在运行。为此,我使用套接字并首先连接到一个 dyndns 地址。之后我尝试连接到我的 ip-box,在那里我可以通过套接字发送命令来打开我的计算机。

当与该套接字的连接失败时,我知道服务器没有运行。

相关代码为:

        socket = new Socket();
        socket.connect(new InetSocketAddress(serverName, port), 10000);
            status = socket.isConnected() == true;
        socket.close();

如果有异常(SocketException)我知道服务器没有运行。 当我打开 WiFi 时,这种方法非常有效。但是,如果 WiFi 没有打开,则连接总是说没问题,即使由于服务器不可用而无法建立连接。

有没有办法检查连接是否真的建立了,即使 WiFi 被禁用了?

欢迎提出任何建议!

谢谢,

鲁迪

【问题讨论】:

  • 你怎么知道连接真的失败了?即使 WiFi 被禁用,仍然可以通过蜂窝数据网络进行连接。请参阅此内容以确保已禁用蜂窝数据网络:newbiehelper.blogspot.com/2011/07/…
  • 由于我尝试启动的服务器没有运行,因此无法建立连接。当我在启用 wifi 的情况下运行程序时,对 socket.connect() 的调用因异常而失败。我应该补充一点,我刚刚在 stackoverflow 上发现了一个非常相似的问题,不幸的是没有得到答复。基本上另一个问题是指3G模式下的问题,所以显然我不是一个人遇到这个问题。
  • 好的,所以它在打开Wifi的情况下工作,在关闭Wifi的情况下不起作用,这在模拟器和真机上都会发生?
  • 这只发生在真手机上,在模拟器上我无法关闭 Wifi - 刚刚尝试过,因为我以前从未在模拟器中将其关闭。实际上,我一直认为套接字在 3G 模式和 Wifi 模式下运行时应该表现相同 - 有点天真;-)
  • 您的问题似乎与以下线程中的问题相似。也许您的手机网络连接上有一些端口过滤?尝试端口 80 建议。 stackoverflow.com/questions/5749612/…

标签: android sockets


【解决方案1】:

尝试像这样打开你的套接字:

public boolean connect(String ip, int port) {
    try {
        this.clientSocket = new Socket(ip, port);
        clientSocket.setSoTimeout(timeout);
        this.outToServer = new DataOutputStream(clientSocket
                .getOutputStream());
        this.inFromServer = clientSocket.getInputStream();
        isconnected = true;
    } catch (IOException e) {
        Log.e("TCPclient", "connection failed on " + ip + ":" + port);
        isconnected = false;
        return isconnected;
    }
    Log.e("TCPclient", "connection to " + ip + " sucessfull");
    return isconnected;
}

如果连接不成功,它会产生一个IOException(在wifi启用且没有服务器的情况下工作,当wifi未启用时(HTC希望2.3))。
这段代码并不正确,只是一个简短的版本

编辑 尝试像这样检查 wfi 状态(不实用但应该可以)

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ConnectivityManager cm = (ConnectivityManager)  getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
      if (ni.isConnected()) {
        Toast.makeText(this,"Wifi enabled", Toast.LENGTH_LONG).show();  
        Log.d("WiFiStateTestActivity", "WiFi!");
      } else {
        Toast.makeText(this,"Wifi not enabled", Toast.LENGTH_LONG).show();  
        Log.d("WiFiStateTestActivity", "not WiFi!");
      }
    }

【讨论】:

  • 刚刚尝试了您的代码 - 对我来说没有任何变化。启用 Wifi 后出现异常,禁用 Wifi 时,套接字会假装一切正常,即使服务器未运行,我也没有异常。哪个语句在您的代码中生成异常?我想,这是对构造函数的调用,对吧?
  • 异常来自:this.clientSocket = new Socket(ip, port); W/System.err(2837):java.net.ConnectException:/192.168.0.1:6789 - 网络无法访问我的应用程序与您的应用程序类似,但我没有您的问题,我的应用程序在我的 HTC désir 上运行没问题,在 android 平板电脑 2.1 上
  • 对我来说,启用 Wifi 时相同的代码会失败,所以这就是我的预期。但我不明白为什么你会在禁用 wifi 的情况下出现异常,而我没有得到 - 可能是 android 版本,但正如我指出的,还有另一个问题是关于两个不同的智能手机和两个不同的 android 版本的相同问题,所以可能是不同的东西。叹息 - 我不知道为什么它不起作用。
  • 也许您可以尝试在套接字输出上写入,我认为即使您的套接字指示已连接或获取 wifi 状态android-er.blogspot.com/2011/01/detect-wifi-onoff-state.html,它也会生成 IOExcption
  • 不... outToServer.writeUTF("test"); ch = inFromServer.read();第一行通过没有问题,第二行返回-1,没有抛出异常……也许我得调试Socket类的源代码才能找出问题所在……
【解决方案2】:

不要忘记在 manifest.xml 中设置权限以允许您的应用打开套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2016-05-10
    • 2021-01-21
    相关资源
    最近更新 更多