2013-06-14 3 views
0

J'ai écrit une petite application de serveur client pour android. Le client est un programme Java exécuté sur mon PC alors que mon téléphone Android est un serveur. Je suis confronté à des problèmes de force dans mon programme serveur. Le serveur démarre assez bien, mais quand j'envoie une chaîne de mon client PC, la force de l'application android (serveur) se ferme. C'est devenu vraiment énervant. S'il vous plaît aider!Le serveur Android tombe en panne

Voici mon programme client en cours d'exécution sur mon PC:

package javaNetPackage; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.JOptionPane; 

public class javaClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws IOException { 

     Socket echoSocket = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 
     String serverIpAddress = "10.81.242.220"; 

     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      echoSocket = new Socket(serverAddr, 4444); 
      out = new PrintWriter(echoSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(
             echoSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host"); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for " 
           + "the connection to server"); 
      System.exit(1); 
     } 

     String str = JOptionPane.showInputDialog("Please give number"); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(echoSocket.getOutputStream())),true); 
     out.println(str); 

    out.close(); 
    in.close(); 
    echoSocket.close(); 
    } 

} 

Et voici mon code serveur exécutant sur Android:

package com.vinit.androidserver; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    ServerSocket ss = null; 
     String mClientMsg = ""; 
     Thread myCommsThread = null; 
     protected static final int MSG_ID = 0x1337; 
     public static final int SERVERPORT = 4444; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final TextView tv=(TextView)findViewById(R.id.textView1); 
     tv.setText("Nothing from client yet"); 
     this.myCommsThread = new Thread(new CommsThread()); 
     this.myCommsThread.start();  
    } 
    @Override 
     protected void onStop() { 
     super.onStop(); 
     try { 
      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.textView1); 
       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(); 
        } 
       } 
      } 
      } 
    } 

Permission:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

mise à jour :: D'accord, j'ai résolu la question de la force proche. J'ai supprimé les balises d'autorisation dans manifest.xml et les ai re-saisies. Mais maintenant, je suis confronté à un problème différent ici. La chaîne envoyée à partir du client PC ne s'affiche pas dans mon serveur TextView (textView1 dans la mise en page xml, dénommé tv dans le code du serveur). Le message par défaut dans la TV est "Nothing from client yet". Lorsque j'envoie une chaîne à partir du client PC, le message par défaut disparaît mais la chaîne envoyée n'est pas mise à jour dans le serveur TextView (tv).

+1

Que vous apprend le journal de processus Android à propos de votre processus? Il vous donnera le nom et l'emplacement de toute exception qui se produit. –

Répondre

0

Vous devez définir la chaîne reçue sur votre objet Message envoyé en myUpdateHandler.sendMessage(m); au lieu de votre champ mClientMsg.

Vous pouvez créer et envoyer l'objet Message comme ci-dessous:

String st = null; 
st = input.readLine(); 
Message msg = Message.obtain(myUpdateHandler, MSG_ID, st); 
msg.sendToTarget(); 

Pour obtenir la valeur dans votre gestionnaire,

case MSG_ID: 
    TextView tv = (TextView) findViewById(R.id.textView1); 
    tv.setText((String) msg.obj); 
    break; 

Je vous suggère d'utiliser un objet Bundle au lieu de l'objet brut bien que. La raison pour laquelle vous finissez avec une chaîne vide est que votre gestionnaire et CommsThread s'exécutent dans différents threads et n'utilisent donc pas la même instance de mClientMsg.

c.-à-d. Que les modifications de CommsThread à mClientMsg ne sont pas visibles dans votre gestionnaire.

+0

Merci beaucoup! Désolé pour cette question idiote cependant! Pourquoi ne pouvons-nous pas simplement écrire input.readLine() dans textView (même thread)? –

+0

@VinitShandilya Vous pouvez mettre la référence de TextView comme champ de membre comme 'myCommsThread' et l'utiliser dans votre thread pour définir le contenu de TextView. – user2172816

Questions connexes