web-dev-qa-db-fra.com

Android TCP Serveur de communication

J'ai trouvé un tutoriel bien écrit ici pour la communication client serveur sur Android. Fonctionne comme un charme. Mais ce n'est qu'une communication à sens unique. J'essaie d'écouter la réponse du serveur dans le client mais je ne sais pas où je me trompe ici. Voici le code pour le serveur où j'essaye d'apporter des modifications.

Serveur

public class Server extends Activity {

    private ServerSocket serverSocket;

    Handler updateConversationHandler;

    Thread serverThread = null;

    private TextView text;



    public static final int SERVERPORT = 8080;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView) findViewById(R.id.text2);

        updateConversationHandler = new Handler();

        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(SERVERPORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {

                try {

                    socket = serverSocket.accept();

                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;

            try {

                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {


            while (!Thread.currentThread().isInterrupted()) {

                try {

                    String read = input.readLine();

                     if (read == null ){
                         Thread.currentThread().interrupt();
                     }else{
                         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                         out.write("TstMsg");
                         updateConversationHandler.post(new updateUIThread(read));

                     }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    class updateUIThread implements Runnable {
        private String msg;

        public updateUIThread(String str) {
            this.msg = str;
        }

        @Override
        public void run() {
            text.setText("Client Says: "+ msg + new Date() + "\n");

        }

    }

}

Client

public class Client extends Activity {

    private Socket socket;

    private static final int SERVERPORT = 8080;
    private static final String SERVER_IP = "192.168.104.107";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
                    new Thread(new ClientThread()).start();

    }


    public void onClick(View view) {
        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);
            out.flush();
            BufferedReader  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String read = in.readLine();
            System.out.println("MSG:" + read);  

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}

Mise à jour

Lorsque le client envoie un message au serveur, le message est reçu par le serveur mais lorsque le serveur envoie sa réponse 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
 out.write("TstMsg");

et en client

String read = in.readLine();
System.out.println("MSG:" + read); 

Il n’est pas reçu par le client ou on peut dire que le serveur écoute les clients mais pas le client. J'ai ajouté les deux permissions dans le manifeste.

<uses-permission Android:name="Android.permission.INTERNET" >
</uses-permission>

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>

Mise à jour Après un long blocage vient ces erreurs.

11-28 18:35:45.786: E/GTalkService(292): connectionClosed: no XMPPConnection - That's strange!
11-28 18:35:48.806: D/ConnectivityService(148): handleInetConditionHoldEnd: net=1, condition=0, published condition=0
11-28 18:35:54.526: I/GTalkService/c(292): [AndroidEndpoint@1090563472] connect: acct=1000000, state=CONNECTING
11-28 18:35:55.176: D/dalvikvm(1167): GC_CONCURRENT freed 495K, 9% free 6604K/7239K, paused 2ms+3ms
11-28 18:35:55.226: D/Finsky(1167): [1] 5.onFinished: Installation state replication succeeded.
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Problem with socket or streams.
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Java.net.ConnectException: failed to connect to www.google-analytics.com/173.194.39.41 (port 80): connect failed: ETIMEDOUT (Connection timed out)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connect(IoBridge.Java:114)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.Socket.connect(Socket.Java:842)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at org.Apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.Java:119)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at com.google.Android.apps.analytics.t.run(Unknown Source)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Handler.handleCallback(Handler.Java:605)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Handler.dispatchMessage(Handler.Java:92)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Looper.loop(Looper.Java:137)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.HandlerThread.run(HandlerThread.Java:60)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.Posix.connect(Native Method)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.Java:85)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connectErrno(IoBridge.Java:127)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connect(IoBridge.Java:112)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  ... 9 more
11-28 18:37:29.016: D/dalvikvm(349): GC_CONCURRENT freed 1258K, 35% free 8238K/12487K, paused 2ms+8ms
8
user934820

Je ne suis toujours pas sûr de ce que vous essayez d'accomplir. Votre journal des erreurs indique une connexion XMPPConnection - Erreur. XMPP n'étant pas géré sur le port que vous utilisez dans le code publié, ce message d'erreur pourrait provenir d'une autre partie de votre application. L'autre message d'erreur est lié à une connexion HTTP - Connexion pour Google Analytics. et ni est lié à l'extrait de code que vous avez posté. Vous devriez rétrograder votre problème en: capturant les exceptions possibles, Log.d avec une balise vous permettant de filtrer vos messages d’erreur par. Martin James donne une bonne idée de la suggestion, aussi essayez-vous de passer à une lecture octet par octet de votre flux d'entrée au moins à des fins de vérification et de traçage si vous recevez des données de votre serveur - la connexion est également une bonne idée.

1
Peter

readLine () attend une ligne réelle: 'Une ligne est considérée terminée par un saut de ligne ('\n '), un retour chariot ('\r ') ou un retour chariot suivi immédiatement d'un saut de ligne. '

Vous devriez donc en envoyer un, par exemple. avec BufferedWriter.newLine ().

1
Martin James

Avez-vous essayé d'ajouter une nouvelle ligne ("\n") en essayant d'écrire? Essayez out.write("TstMsg"+ "\n") à la place. 

0
Les

Avez-vous écrit l'extrait suivant dans votre code

out.flush();

après 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
out.write("TstMsg");
0
kumar