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

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

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

Обновление: я работаю с 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"); } } // } 

См. Здесь :

Хост-машина может быть достигнута с использованием IP-адреса 10.0.2.2 из эмулятора.

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

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

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

  • 10.0.2.1 , адрес маршрутизатора / шлюза.
  • 10.0.2.2 , Специальный псевдоним для вашего интерфейса 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 , собственный интерфейс сети / ethernet эмулируемого устройства
  • 127.0.0.1 , собственный интерфейс обратной петли эмулируемого устройства

Тем не менее, мы имеем:

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

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

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

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

Пример: в моей сети (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 к hostComputerIP:localPort .

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

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

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

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