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
无WIFi连接的Android socket编程_Android_Sockets - Fatal编程技术网

无WIFi连接的Android socket编程

无WIFi连接的Android socket编程,android,sockets,Android,Sockets,我已经编写了一个应用程序,在家里远程启动我的服务器。当启用WiFi时,该应用程序在模拟器和我的智能手机(HTC desire,Android 2.2)上都可以正常工作。 但是,当禁用WiFi时,它不起作用 在重新启动之前,我首先检查它是否已经运行。为此,我使用套接字,首先连接到一个dyndns地址。之后,我尝试连接到我的ip盒,在那里我可以通过套接字发送命令来打开我的计算机 当与该套接字的连接失败时,我知道服务器没有运行 有关守则如下: socket = new Socket()

我已经编写了一个应用程序,在家里远程启动我的服务器。当启用WiFi时,该应用程序在模拟器和我的智能手机(HTC desire,Android 2.2)上都可以正常工作。 但是,当禁用WiFi时,它不起作用

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

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

有关守则如下:

        socket = new Socket();
        socket.connect(new InetSocketAddress(serverName, port), 10000);
            status = socket.isConnected() == true;
        socket.close();
如果出现异常(SocketException),我知道服务器没有运行。 当我打开WiFi时,这种方法非常有效。但是,如果WiFi未打开,则即使由于服务器不可用而无法建立连接,连接也会始终显示正常

是否有办法检查连接是否真正建立,即使WiFi被禁用

欢迎任何建议

谢谢


鲁迪试着像这样打开你的插座:

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 desire 2.3)时工作)。
这段代码不是很正确,它只是一个简短的版本

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


别忘了在manifest.xml中设置允许应用打开套接字的权限。

您如何知道连接确实失败?即使禁用WiFi,也可能通过蜂窝数据网络进行连接。查看此信息以确保蜂窝数据网络已禁用:由于我尝试引导的服务器未运行,因此无法建立连接。当我在启用wifi的情况下运行程序时,对socket.connect()的调用会异常失败。我应该补充一点,我刚刚在stackoverflow上发现了一个非常类似的问题,不幸的是没有得到回答。基本上,另一个问题是指3G模式下的问题,所以显然我不是唯一遇到这个问题的人。好吧,它在Wifi打开的情况下工作,在Wifi关闭的情况下不工作,这在模拟器和真实手机上都会发生?这只发生在真实手机上,在模拟器上我无法关闭Wifi-刚刚尝试过,因为我以前从未费心在模拟器中关闭它。事实上,我一直认为,在3G模式和Wifi模式下运行时,套接字的行为应该是相同的-这有点幼稚;-)您的问题似乎与以下线程中的问题相似。也许你的手机网络连接上有一些端口过滤?尝试端口80建议。刚刚试过你的代码-我没有改变。启用Wifi时,我会遇到异常,禁用Wifi时,插座会假装一切正常,即使服务器未运行,我也不会遇到异常。哪个statement在代码中生成异常?我假设,这是对构造函数的调用,对吗?异常来自:this.clientSocket=newsocket(ip,port);W/System.err(2837):java.net.ConnectException:/192.168.0.1:6789-无法访问网络我的应用程序和你的一样,但我没有你的问题,我的应用程序在我的HTC désir上运行没有问题,在android平板电脑2.1上,对我来说,启用Wifi时同样的代码会失败,所以这就是我所期望的。但我不明白为什么你会遇到wifi被禁用的例外,而我却没有——可能是android版本,但正如我指出的,关于两款不同的智能手机和两款不同的android版本的相同问题,还有另一个问题,所以可能是不同的。叹气-我不知道为什么它不工作。也许你可以尝试在套接字输出上写入,我认为它将生成一个IOException,即使你的套接字指示已连接或获取wifi状态Nope。。。outToServer.writeUTF(“测试”);ch=inforomserver.read();第一行顺利通过,第二行返回-1,没有引发异常。。。也许我必须调试Socket类的源代码,以找出潜在的问题。。。
    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!");
      }
    }