2016-09-12 1 views
1

quoi de neuf les gars. J'ai un problème ici. Le fichier est en cours d'exécution mais il y a des erreurs logiques. J'ai connecté mon application Android à cette application Java. J'essaie d'envoyer plusieurs messages dans une liste d'un JFrame, ça se voit, mais ça ne se voit pas pendant que le JFrame est en cours d'exécution. Il va comme ceciMon JFrame apparaît après l'exécution d'une boucle "while". Je veux que le JFrame montre pendant qu'il fonctionne

(Jframe TOUJOURS PAS AFFICHE) je me connecte à java app

(Jframe TOUJOURS PAS AFFICHE) Envoyer des messages, il montre en println Puis après je ferme mon application Android

JFrame s'affiche à partir de l'application java avec les messages que j'ai envoyés (les messages sont stockés dans un JList)

Je veux que ce soit comme si le JFrame est affiché, je veux ajouter les valeurs dans Jlist. S'il vous plaît voir ce code. Ceci est le code im en utilisant

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JList; 


public class frmTestList extends JFrame { 
public static final int portNumber = 60123; 
private JPanel contentPane; 
static String data; 
static DefaultListModel model = new DefaultListModel(); 
/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 

      frmTestList frame = new frmTestList(); 
       frame.setVisible(true); 
       try { 


        ServerSocket serverSocket = null; 
        serverSocket = new ServerSocket(portNumber); 
        Socket socket = serverSocket.accept(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

         while((data = br.readLine()) != null){ 

         System.out.println("Message from the client: " + data); 
         model.addElement(data); 
         } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public frmTestList() { 


    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JList list = new JList(model); 
    contentPane.add(list, BorderLayout.CENTER); 


} 




} 

code Android:

import android.app.Activity; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.EditText; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class MainActivity extends Activity { 

Socket socket = null; 
public String debuggingString = "DEBUG"; 
public String hostname = ""; // <-- my ipv4 is here 
public int portNumber = 60123; 

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

    new Thread() { 
     @Override 
     public void run() { 

      try { 
       //connecting 
       Log.e(debuggingString, "Attempting to connect to server"); 
       socket = new Socket(hostname, portNumber); 

       //Send message to server 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
       bw.write("this is a message from the client"); 
       bw.newLine(); 
       bw.flush(); 

       //Receive message from server 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       System.out.println("Message from server: " + br.readLine()); 
      } catch (
        Exception e 
        ) 

      { 
       Log.e(debuggingString, e.getMessage()); 
      } 
     } 

    }.start(); 
} 

; 

public void sendMessage(View v) { 
    EditText editText = (EditText) findViewById(R.id.editText); 

    BufferedWriter bw = null; 

    try { 
     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     bw.write(editText.getText().toString()); 
     bw.newLine(); 
     bw.flush(); 
    } catch (Exception e) { 
     Log.e(debuggingString, e.getMessage()); 
    } 
} 
} 

Merci à l'avance les gars!

+0

Note latérale: ClassNames vont UpperCase en Java. Donc, frmTestList est simplement un mauvais nom! – GhostCat

+0

Astuce: s'il vous plaît laissez-nous savoir si ma simple suggestion a déjà fonctionné. – GhostCat

+0

Merci pour la note de côté, @GhostCat. Mais la solution que vous avez suggérée ne fonctionne toujours pas. – NewbieProgrammer

Répondre

0

Mise à jour: après une réflexion plus approfondie, je devine: votre problème pourrait être

A) que votre serveur est assis là et attend l'entrée du client. Signification: il boucle sur "nouvelle entrée" ... probablement jusqu'à ce que le client ferme la connexion.

et/ou

B) que votre « serveur » tente de mettre à jour l'interface utilisateur dans le même thread qui accepte. Donc, essayez:

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String line = null; 
while((line = br.readLine()) != null) { 
    System.out.println("Message from server: " + br.readLine()); 
    EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     model.addElement(line); 
    } 

Enfin: si ces idées ne fonctionnent pas; vous devriez prendre du recul - en simplifiant votre installation (en supprimant Android de l'image): créez le socket client dans votre JFrame et faites en sorte que ce processus soit client/serveur en même temps. Cela rendra le débogage/expérimentation beaucoup plus facile. Seulement quand cela fonctionne, déplacez le client ... dans une autre JVM, puis sur "Android". En d'autres termes: revenez en arrière et commencez par un test Client/Serveur très simple qui fait tout en une classe. Quand cela fonctionne, continuez.

+0

Bonjour, @GhostCat! J'ai essayé votre solution suggérée. Mais ça ne marche toujours pas comme je le veux. Merci quand même! – NewbieProgrammer

+0

Eh bien "ne fonctionne pas comme je le veux" ne dit pas si/quoi a changé en faisant ce changement. Ce qui serait nécessaire, si vous voulez que nous fournissions d'autres idées. – GhostCat

+0

Oui, bien sûr GhostCat! J'aimerais tester d'autres idées de vous. C'est le flux d'état actuel de mon programme maintenant. (Jframe montre) L'application Java s'exécute (Jframe montre) Envoyer des messages sur l'application java à partir de l'application android Après avoir fermé mon application android, la liste met à jour les messages que j'ai envoyés. Je veux que le programme fonctionne comme ceci (Jframe montre) J'envoie des messages sur l'application java de l'application android puis change les valeurs de la liste au moment où je clique sur le bouton de l'application android. – NewbieProgrammer

0

La raison pour laquelle votre JFrame ne s'affiche pas est parce que vous effectuez toutes vos lectures de socket à partir du Thread Dispatching. Cela bloquera toutes les mises à jour de l'interface utilisateur. Déplacez vos actions de lecture de socket vers son propre thread et appelez invokeLater lors de la mise à jour du modèle JList.

public static void main(String[] args) { 
    frmTestList frame = new frmTestList(); 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      frame.setVisible(true); 
     } 
    }); 

    Runnable runnable = new Runnable() { 
     public void run() { 
      try { 
       ServerSocket serverSocket = new ServerSocket(portNumber); 
       Socket socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

       while((data = br.readLine()) != null) { 
        EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          model.addElement(data); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    new Thread(runnable).start(); 
} 
+0

Bonjour, @eighthrazz! La réponse de GhostCat a déjà fonctionné pour moi. Mais merci de fournir une autre solution. J'espère que d'autres personnes bénéficieront de la solution que vous avez fournie! Je vous remercie! – NewbieProgrammer