Conectando 2 instancias de Emulator en Android

Quiero crear un Servidor y un Cliente en 2 Emulator para escribir y leer datos. Escribo el código para el Servidor:

public class ServerActivity extends Activity { /** Called when the activity is first created. */ private ServerSocket serverSocket = null; private TextView tv; public static final int SERVERPORT = 4444; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv= (TextView) findViewById(R.id.myTextView); try { Connect(); } catch (IOException e) { // TODO Auto-generated catch block tv.setText("Not connected"); e.printStackTrace(); } } public void Connect() throws IOException { serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress("10.0.2.15", 4444)); while(true) { Socket socket = serverSocket.accept(); tv.setText("Connected..."); } } 

Y código para el cliente

 public class ClientActivity extends Activity { /** Called when the activity is first created. */ private Button bt; private TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt = (Button) findViewById(R.id.myButton); tv = (TextView) findViewById(R.id.myTextView); bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub try { Socket socket = new Socket("10.0.2.2", 4445); } catch (UnknownHostException e) { // TODO Auto-generated catch block tv.setText("Error1"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block tv.setText("Error2"); e.printStackTrace(); } } }); } } 

Configuré una redirección:

 telnet localhost 5554 redir add tcp:4445:4444 

Pero no se está conectando … Por favor, ayúdenme. Lo aprecio.

Tuve éxito con esto después de un tiempo. No hice ninguna referencia a 10.0.2.15 en el servidor o cliente. Abrí el socket del servidor de manera diferente y manejé las comunicaciones en un hilo separado. Ejecuté el servidor en el emulador 5554 y el cliente en 5556.

Mi código de servidor, escuchando en 6000

 public class SocketServer extends Activity { ServerSocket ss = null; String mClientMsg = ""; Thread myCommsThread = null; protected static final int MSG_ID = 0x1337; public static final int SERVERPORT = 6000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.TextView01); tv.setText("Nothing from client yet"); this.myCommsThread = new Thread(new CommsThread()); this.myCommsThread.start(); } @Override protected void onStop() { super.onStop(); try { // make sure you close the socket upon exiting ss.close(); } catch (IOException e) { e.printStackTrace(); } } Handler myUpdateHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_ID: TextView tv = (TextView) findViewById(R.id.TextView01); tv.setText(mClientMsg); break; default: break; } super.handleMessage(msg); } }; class CommsThread implements Runnable { public void run() { Socket s = null; try { ss = new ServerSocket(SERVERPORT ); } catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { Message m = new Message(); m.what = MSG_ID; try { if (s == null) s = ss.accept(); BufferedReader input = new BufferedReader( new InputStreamReader(s.getInputStream())); String st = null; st = input.readLine(); mClientMsg = st; myUpdateHandler.sendMessage(m); } catch (IOException e) { e.printStackTrace(); } } } } } 

Redirigí puertos similares a ti

 telnet localhost 5554 redir add tcp:5000:6000 

Mi código de cliente establece conexión en el puerto 5000:

 public class SocketClient extends Activity { private Button bt; private TextView tv; private Socket socket; private String serverIpAddress = "10.0.2.2"; // AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO // PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S // PORT 6000 private static final int REDIRECTED_SERVERPORT = 5000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt = (Button) findViewById(R.id.myButton); tv = (TextView) findViewById(R.id.myTextView); try { InetAddress serverAddr = InetAddress.getByName(serverIpAddress); socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { EditText et = (EditText) findViewById(R.id.EditText01); String str = et.getText().toString(); PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); out.println(str); Log.d("Client", "Client sent message"); } catch (UnknownHostException e) { tv.setText("Error1"); e.printStackTrace(); } catch (IOException e) { tv.setText("Error2"); e.printStackTrace(); } catch (Exception e) { tv.setText("Error3"); e.printStackTrace(); } } }); } } 

El servidor tiene un TextView para recibir el mensaje, el cliente tiene un EditText para redactar el mensaje y un botón para enviarlo.

Funciona muy bien

Solo tiene que agregar dos pasos: 1) Agregar una etiqueta de permiso de INTERNET fuera de la etiqueta de la aplicación en AndroidManifest.xml

2) No funciona con Android> 3 debido a la restricción de red en el hilo de UI