2011-01-13 3 views
3

Je souhaite créer un serveur et un client dans 2 Emulator pour écrire et lire des données. Je écrire du code pour le serveur:Connexion de 2 instances d'émulateur sous Android

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..."); 
    } 


    } 

et le code pour le client

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(); 
    } 

    } 
    }); 
    } 
} 

Je mis en place une redirection:

telnet localhost 5554 
redir add tcp:4445:4444 

mais pas la connexion .... S'il vous plaît aidez-moi. Je vous en suis reconnaissant.

+1

Je n'ai jamais trouvé un moyen de le faire. Bonne chance. – Falmarri

+0

@Falmarri: Ce que NickT posté fonctionne très bien! – prolink007

Répondre

16

J'ai eu du succès avec ça après un certain temps. Je n'ai fait aucune référence à 10.0.2.15 dans le serveur ou le client. J'ai ouvert le socket du serveur différemment et les communications ont été traitées dans un thread séparé. J'ai couru le serveur sur l'émulateur 5554 et le client sur 5556.

Mon code serveur, à l'écoute sur 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(); 
      } 
     } 
     } 
    } 
} 

I redirigée ports similaires à vous

telnet localhost 5554 
redir add tcp:5000:6000 

Ma connexion code client establshing sur port 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(); 
      } 
     } 
     }); 
    } 
} 

Le serveur a un TextView pour recevoir le message, le client s un EditText pour composer le message et un bouton pour l'envoyer.

+0

Merci NickT, fonctionne très bien. Souhaite que je puisse accepter votre réponse. = P – prolink007

+0

J'ai essayé d'exécuter votre code dans ma machine mais ça me donne l'erreur3 côté client, pourriez-vous m'aider? – matarsak

+2

Trop longtemps pour moi de me souvenir désolé. Mettez un point d'arrêt dans ce bloc catch et voyez le type d'exception. – NickT

0

Il fonctionne très bien

Vous avez juste besoin d'ajouter deux étapes: 1) Ajouter une marque d'autorisation INTERNET extérieur étiquette d'application dans AndroidManifest.xml

2) Doesnt travailler avec Android> 3 à cause du réseau restriction sur le thread d'interface utilisateur

Questions connexes