2013-01-31 3 views
0

Je suis nouveau à la programmation dans Android et j'ai besoin d'aide pour créer une application. Je veux que deux téléphones se connectent l'un à l'autre, l'un étant le client et l'autre étant le serveur. Je veux que le client ait 2 étapes. Dans le premier cas, l'utilisateur saisit l'adresse IP du serveur et clique sur un bouton pour établir la connexion. Dans la seconde, l'utilisateur saisit un message et clique sur un bouton pour l'envoyer au serveur.comment travailler avec des prises, des activités et des vues?

Le code ci-dessous est d'envoyer la chaîne "message" au serveur mais comme je le disais je veux que l'utilisateur puisse entrer la chaîne. Je ne sais pas comment aborder son problème, ai-je besoin d'une deuxième activité à appeler une fois que la connexion est établie dans l'activité que je montre ci-dessous? Dans ce cas je ne saurais pas comment passer une socket à une autre activité, je sais seulement comment passer des cordes. En outre, j'aurais besoin d'un autre bouton et donc d'un nouveau OnClickListener et je devrais encore passer le socket à cette fonction. Sans utiliser une seconde activité, je ne sais pas comment faire apparaître le deuxième champ d'entrée (celui où l'utilisateur entrerait le message à envoyer au serveur) une fois la connexion établie. Les vues (layout.xml) pour cette activité sont déjà associées à la même chose, je ne peux pas simplement effacer l'écran et créer un nouveau champ EditText à la volée.

J'espère que je me suis fait clair.

Merci à l'avance

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_client); 

    serverIp = (EditText) findViewById(R.id.server_ip); 
    connectPhones = (Button) findViewById(R.id.connect_phones); 
    connectPhones.setOnClickListener(connectListener);  

} 

private OnClickListener connectListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start(); 
      } 
     } 
    } 
}; 

public class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
      connected = true; 
      while (connected) { 
       try { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
        **out.println("messageToSend");** 
       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 
      } 
      socket.close(); 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 
} 
} 

Répondre

1

Je ne pense pas, vous avez besoin d'une deuxième activité pour envoyer un message sur socket.

Quoi qu'il en soit, cela dépend de vous conception -

vous pouvez avoir deux editTexts à une même mais leur visibilité serait différent. ServerIpAddressET peut être visible lorsque l'utilisateur n'a pas fourni d'adresse IP de socket. Une fois la connexion établie, vous pouvez modifier la visibilité de serverIpAddressET sur Gone et rendre visible le messageET.

+0

J'ai toujours le problème du bouton. J'ai besoin d'instancier un nouvel objet OnClickListener où je ferais la tâche d'envoyer le message mais je ne peux pas lui passer le socket. – cracq

+1

pourquoi pas ... vous pouvez avoir un OnClickListener pour les deux boutons et dans le cas de commutateur, vous pouvez vérifier le R.id. Vous pouvez utiliser socket dans cela. – Jambaaz

1

bien une solution rapide serait de cacher la EditText et le bouton actuellement affiché par

view.setVisiblility(View.GONE) 

et afficher l'autre editText et le bouton via

view.setVisibility(View.Visible) 

et utiliser la même activité ...

Mais une meilleure solution serait d'ouvrir la socket pour la communication dans un service regarder dans android Service avec Sockets ... démarrer le service en première activité et lorsque la connexion est établie passer trop deuxième activité et lier l'activité avec le service afin peut être communication btw activité et service ...

+0

Je vais vérifier cela, mais je veux d'abord créer une application simple. Donc, comme je le disais à GDG, la mise en œuvre du bouton pour envoyer le message reste un problème. – cracq

1

Pas tout à fait sûr de ce que vous cherchez ici, mais si je comprends bien, vous êtes en train de se demander comment envoyer un message. Ajoutez simplement

 message2send= (EditText) findViewById(R.id.user_message); 

et où vous avez

  **out.println("messageToSend");** 

remplacer par

  **out.println(message2send);** 

et ajouter un champ de texte d'édition supplémentaire à votre disposition.

Il convient de noter que votre façon de procéder n'est pas idéale car l'autre téléphone (serveur) devrait être à l'écoute de la prise pour recevoir le message qui entraînerait des frais de données supplémentaires ainsi que gaspillage de puissance de la batterie (traditonal dans un mobile est un serveur entre les 2 téléphones pour stocker le message en cas d'utilisateur si hors ligne ou téléphone est mort)

Espérons que cela aide le moins!

+1

point valide un intermédiaire courtier/serveur est préféré, si vous ne voulez pas entrer dans l'hastle de l'écriture de toute la logique du serveur, se pencher sur des solutions AMQP .. particulièrement RabbitMQ pour la communication btw android définit l'exemple: http://simonwdixon.wordpress.com/2011/06/03/getting-started-with-rabbitmq-on-android-part-1/ – baboo