Программирование сокетов Android без подключения к WIFi - PullRequest
7 голосов
/ 02 января 2012

Я написал приложение для удаленного запуска моего сервера дома. Приложение работает без проблем в эмуляторе, а также на моем смартфоне (HTC desire, Android 2.2) при включенном WiFi. Однако это не работает, когда WiFi отключен.

Перед перезапуском я сначала проверяю, запущен ли он. Для этого я использую сокеты и сначала подключаюсь к адресу dyndns. После этого я пытаюсь подключиться к своему ip-боксу, где я могу включить компьютер, отправляя команды через сокет.

Когда соединение с этим сокетом не удается, я знаю, что сервер не работает.

Соответствующий код:

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

Если есть исключение (SocketException), я знаю, что сервер не работает. Этот подход отлично работает, когда я включил WiFi. Однако если WiFi не включен, то при подключении всегда говорится, что все в порядке, даже если не удалось установить соединение, поскольку сервер недоступен.

Есть ли способ проверить, действительно ли установлено соединение, даже если WiFi отключен?

Любые предложения приветствуются!

Спасибо

Rudi

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Попробуйте открыть вашу розетку так:

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 (работает, когда Wi-Fi включен, а сервер отсутствует, а Wi-Fi не включен (HTC desire 2.3)).
Этот код не совсем правильный, это просто короткая версия

EDIT Попробуйте проверить состояние 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!");
      }
    }
1 голос
/ 24 апреля 2012

Не забудьте установить разрешение в manifest.xml, чтобы приложение могло открывать сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...