2012-02-26 5 views
0

Je suis en train de développer la prise en utilisant la communication client-serveur:Programmation socket android: communication serveur client?

package com.exercise.AndroidClient; 
import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.UnknownHostException; 

//import com.app.Client.ClientActivity.ServerThread; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class AndroidClientActivity extends Activity { 

EditText textOut; 
TextView textIn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    textOut = (EditText)findViewById(R.id.textout); 
    Button buttonSend = (Button)findViewById(R.id.send); 
    textIn = (TextView)findViewById(R.id.textin); 
    /* Runnable showmessage=new Runnable() 
    { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 


     } 

    };*/ 
    /*Thread thd=new Thread(new ServerThread()); 
     thd.start();*/ 
buttonSend.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     DataOutputStream dataOutputStream = null; 
     try { 
      Socket socket = new Socket("192.168.1.9", 70); 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
     } catch (IOException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     try { 

       dataOutputStream.writeUTF(textOut.getText().toString()); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
    } 
}); 
Thread thd=new Thread(new ServerThread()); 
    thd.start(); 
    /*buttonSend.setOnClickListener(buttonSendOnClickListener) 
Button.OnClickListener buttonSendOnClickListener 
= new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
// TODO Auto-generated method stub 

} 
} */ 
} 
      public class ServerThread implements Runnable{ 
       @Override 
       public void run() { 
        Socket socket = null; 
        DataOutputStream dataOutputStream = null; 
        DataInputStream dataInputStream = null; 
        BufferedReader in=null; 

        try { 
        socket = new Socket("192.168.1.9", 70); 
        InputStream inputStream = socket.getInputStream(); 
       // DataInputStream in1 = new DataInputStream(inputStream); 
        char chstr[]=new char[512]; 
        //textIn.setText("rafa2"); 
        // DataInputStream inq=new DataInputStream(new BufferedInputStream(inputStream)); 
       in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

        textIn.setText("rafa1"+in.read(chstr)); 
        // textIn.setText("ramla"+socket+inq.readUTF()); 
        }catch (UnknownHostException e) { 
         System.err.println("Don't know about host: taranis."); 
         System.exit(1); 
        } catch (IOException e) { 
         System.err.println("Couldn't get I/O for " 
              + "the connection to: taranis."); 
         System.exit(1); 
        } 



        // dataInputStream = new DataInputStream(socket.getInputStream()); 

        // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

       /*  BufferedReader stdIn = null; 
        try { 
          socket = new Socket("192.168.110.49", 4023); 
         stdIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         textIn.append("gggg"+stdIn.readLine()); 
         String userInput; 
         while ((userInput =stdIn.readLine()) != null) { 
           // out.println(userInput); 
           // System.out.println("echo: " + in.readLine()); 
           textIn.append("rafa"); 
           textIn.append(userInput+stdIn.readLine()); 
        }} catch (IOException e1) { 
         // TODO Auto-generated catch block 

         e1.printStackTrace(); 
        } 
         String userInput = null; 
         /*textIn.append("rafa1"); 
         try { 
          textIn.append("jjjj"+stdIn.readLine()); 
         } catch (IOException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         }*/ 
       /*  try { 
          String userInput; 
          while ((userInput =in1.readLine()) != null) { 
           // out.println(userInput); 
           // System.out.println("echo: " + in.readLine()); 
           textIn.append("rafa"); 
           textIn.append(userInput+in.readLine()); 

          } 

         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         }*/ 



       } 
      } 

} 

Voici ma question: pourquoi le message client ne reçoit pas de serveur? Cela vient de près. Quelle est l'erreur dans le code? Il envoie un message correctement au serveur. J'utilise le logiciel "Hercules" comme serveur.

Voici les erreurs dans logcat:

02-26 12:34:35.956: E/AndroidRuntime(679): FATAL EXCEPTION: Thread-8 
02-26 12:34:35.956: E/AndroidRuntime(679): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.view.View.invalidate(View.java:5139) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.widget.TextView.checkForRelayout(TextView.java:5364) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.widget.TextView.setText(TextView.java:2688) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.widget.TextView.setText(TextView.java:2556) 
02-26 12:34:35.956: E/AndroidRuntime(679): at android.widget.TextView.setText(TextView.java:2531) 
02-26 12:34:35.956: E/AndroidRuntime(679): at com.exercise.AndroidClient.AndroidClientActivity$ServerThread.run(AndroidClientActivity.java:101) 
02-26 12:34:35.956: E/AndroidRuntime(679): at java.lang.Thread.run(Thread.java:1096) 
02-26 12:34:36.426: W/IInputConnectionWrapper(679): showStatusIcon on inactive InputConnection 
+0

Avez-vous déjà regardé le message d'erreur? Vous essayez de modifier la vue (textIn) à partir d'un thread autre que le thread de l'interface utilisateur ... – claesv

+0

À titre de recommandation personnelle, je vous suggère de jeter un coup d'œil au projet Netty avant de poursuivre votre projet. – jsaye

Répondre

0

J'ai regardé votre code et je peux vous dire quelques conseils/des choses qui peuvent vous causer des problèmes.

  • Tout d'abord, vous utilisez Hercules. Je ne sais pas comment Hercules est implémenté, mais vous devez vous assurer que le serveur vous envoie les données comme vous l'attendez, même codage, même temps ... cela signifie que vous devez utiliser la méthode appropriée de InputStreamReader, lorsque tu veux lire.

  • En second lieu, la CPU va plus vite que toute connexion Internet, ce signifie que vous devrez attendre jusqu'à ce que vous avez des données et faire quelque chose comme ceci:

while(socket.getInputStream().available()!=0){}

Le la méthode avilable() renvoie le nombre estimé d'octets qui seront prêts à lire; même si vous ne devez utiliser cette méthode que pour répondre à la question "est-ce qu'il y a définitivement des données prêtes?".

J'espère que cela aide un peu.

Questions connexes