Доступ к сетевому устройству по IP и порту с помощью эмулятора Android

Почему мое приложение Java для Android не подключается к серверу?

Я запускаю приложение в эмуляторе Android и сервер, который находится на порту 9999 и хост 127.0.0.1 на моем компьютере, но он просто не подключается, и я думаю, что этот метод не подходит для приложения Sndroid.

Обновление: я работаю с API 8 и Android 2.2

Это мой исходный код:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
//Java imports
//import android.util.Log;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;


public class MainActivity extends Activity{
//Variaveis Interface
private Button ligar;
private Button enviar;
private EditText text1;
private TextView text2;
//Variaveis
static Socket cSocket;
static PrintWriter out;
static BufferedReader in;
   

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    //Declaração butões
    ligar = (Button) findViewById(R.id.ligar);
    enviar = (Button) findViewById(R.id.enviar);
    text1 = (EditText) findViewById(R.id.text1);
    text2 = (TextView) findViewById(R.id.text2);

    //Interacao
    ligar.setOnClickListener(new OnClickListener(){
        public void onClick(View arg0){
             connect();
        }
    });
    enviar.setOnClickListener(new OnClickListener(){
        public void onClick(View arg0){
               out.println("Hello");
               text2.setText("");
        }
    });
  }
  //Outras Funcoes

public void connect(){
//Funcao ligar
cSocket = null;
out = null;
in = null;

try{
   cSocket = new Socket("10.0.2.2",4444);
   out = new PrintWriter(cSocket.getOutputStream(), true);
   in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
   text2.setText("Estas conectado com sucesso.");
   }
   catch (IOException ex) {
   //Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);
   text2.setText("Erro! Na conexão");
   }                
   }
//
}

person FredVaz    schedule 19.11.2011    source источник
comment
Не забудьте отметить ответ как принятый или опубликовать собственное решение (в случае, если приведенные ниже ответы не помогли решить вашу проблему) и примите его. Каждый раз, когда вы решаете свою проблему, вы должны завершить вопрос, пометив один ответ как принятый.   -  person davidcesarino    schedule 20.11.2011


Ответы (2)


См. здесь:

Доступ к хост-машине можно получить с помощью IP-адреса 10.0.2.2 из эмулятора.

** редактировать, ответьте на ваш комментарий: *

Для полноты и лучшего понимания моего ответа прочтите документацию по эмулятору Android.

Это IP-адреса, полученные из эмулятора:

  • 10.0.2.1, адрес маршрутизатора / шлюза.
  • 10.0.2.2, специальный псевдоним для вашего хоста интерфейса обратной связи (т. Е. 127.0.0.1 на вашем компьютере для разработки)
  • 10.0.2.3, Первый DNS-сервер
  • 10.0.2.4 / 10.0.2.5 / 10.0.2.6, Необязательный второй, третий и четвертый DNS-сервер (если есть)
  • 10.0.2.15, эмулированный собственный сетевой / сетевой интерфейс устройства.
  • 127.0.0.1, эмулированный собственный интерфейс обратной связи устройства

При этом у нас есть:

  • Распространенная ошибка 1: доступ к 127.0.0.1 из эмулятора пытается подключиться к вашему хост-компьютеру. Как я уже сказал, используйте 10.0.2.2.
  • Распространенная ошибка 2: Попытка получить доступ к службе эмулятора на HostComputerIP:appServicePort. Это не сработает, поскольку на самом вашем хост-компьютере (Windows, Linux, ОС и т. Д.) Не работает служба в этом порту. Вам необходимо перенаправить порт на консоли эмулятора на порт на самом эмулируемом экземпляре Android (см. 2 ниже).

Общие сетевые потребности:

1. Приложение-эмулятор в качестве клиента и локальный компьютер в качестве сервера

Поскольку эмулятор имеет NAT, я считаю, что вы можете напрямую подключиться к любому компьютеру в своей локальной сети. Я имею в виду, что, поскольку виртуальный маршрутизатор имеет доступ к обеим сетям, он должен иметь возможность нормально обрабатывать исходящие (т.е. эмулятор-> настоящую локальную сеть) соединения.

Пример: в моей сети (192.168.0.x) я могу подключить из эмулятора к моему настоящему маршрутизатору (192.168.0.254), просто указав эмулятор веб-браузера на http://192.168.0.254:port. Я использую на нем разные сервисы (приветствую Tomato!), И я могу получить доступ ко всем из них на каждом port. Нет необходимости обрабатывать переадресацию портов, как ожидалось.

Судя по вашему коду, я считаю, что вам нужно:

// I assume 192.168.0.114 is your server, which is
// located on your local network, running a server application
// on port 9999.
cSocket = new Socket("192.168.0.114",9999);

2- Локальный компьютер в качестве клиента и приложение-эмулятор в качестве сервера

Теперь это другая история. Вам необходимо настроить перенаправление портов на виртуальном роутер. Самый простой способ:

Telnet в систему управления (это не эмулятор) с вашего хоста (ваш компьютер, консоль в Linux или командная строка в Windows):

telnet localhost 5554

После этого используйте:

adb forward tcp:localPort tcp:emulatorPort

После этого вы сможете использовать службу на emulatorPort, и вы сможете подключаться к ней с компьютеров в локальной сети, открыв hostComputerIP:localPort.

Так люди (в том числе и я) используют, например, SSHDroid внутри эмулятора.

Что-нибудь еще?

person davidcesarino    schedule 19.11.2011
comment
Да, это правильно, однажды я вырвал волосы из-за этого вопроса. - person Jack; 19.11.2011
comment
Не работает ... и уже тест с беспроводной связью, эмуладор на другом компьютере, что Server! - person FredVaz; 19.11.2011
comment
Вы должны были сказать, что он не на сервере, а на другом компьютере. Вы сказали host 127.0.0.1 на my pc, поэтому мы догадались, что это то же самое. В любом случае, я обновил ответ двумя решениями вашей проблемы, в зависимости от того, именно вы хотите сделать. - person davidcesarino; 19.11.2011
comment
Нет, это то же самое ... но я уже тестировал этот эмулятор на разных компьютерах ... извините, мой плохой английский. - person FredVaz; 19.11.2011
comment
Нет проблем с английским языком. Итак ... ответьте мне ДА / НЕТ: 1) ваш код находится в эмуляторе, 2) ваш сервер находится в локальной сети, 3) ваш сервер НЕ находится на том же компьютере, что и ваш эмулятор . --- Это правильно? - person davidcesarino; 19.11.2011
comment
Não entendi, então vou falar português mesmo. Antes Você препровождает emulador на другом компьютере, что Server, agora Vêêêise [сервер] является той же машиной. Если нет mesmo computador, используйте 10.0.2.2. Если вы не знаете, что делать, если вы используете проблему брандмауэра, или если вы используете его, это не так, как вычислить. - person davidcesarino; 19.11.2011
comment
Сим-рассу, мас-ан-ке фой-нам-тесте, физ, е нет функции ... сим, ЕС конхесо или 10.0.2.2, мас я вам тестар мелхо. Обригадо - person FredVaz; 20.11.2011

127.0.0.1 переходит на localhost. Хотя это ваш собственный компьютер от вашего ПК, это телефон от телефона. Вам необходимо указать фактический IP-адрес. Кроме того, если вы еще не установили его, убедитесь, что вы запрашиваете разрешение в Интернете. См. документ о разрешениях и это другое сообщение SO.

Обновление: Чтобы ответить на ваш комментарий, как указывает Дэвид из эмулятора, вы можете использовать 10.0.2.2 для доступа к своему хост-компьютеру.

person kabuko    schedule 19.11.2011
comment
127.0.0.1 переходит на локальный хост Android или мой компьютер с Windows! Я тестирую свое приложение на сервере эмулятора Android и в окнах, на которых запущен эмулятор ... вы понимаете?;) - person FredVaz; 19.11.2011
comment
Эмулятор Android - это виртуальная машина, поэтому 127.0.0.1 относится к локальному хосту самого эмулятора Android S.O. - person Jordi Coscolla; 19.11.2011
comment
хорошо, я понял ! Итак, как я могу протестировать? Или какой IP-хост я могу использовать в Android для подключения к серверу? - person FredVaz; 19.11.2011