2010-11-27 9 views
4

J'essaye de créer un client de socket avec une interface Web par JSF. Dans cette application, le client se connecte au serveur, envoie le message au serveur, reçoit le message du serveur et l'affiche sur la page JSF.Impossible de mettre à jour la valeur du composant qui est lié au bean

J'ai réussi à me connecter au message d'envoi du serveur de sockets et à recevoir un message. Je suis incapable d'afficher le message du serveur dans l'écran du navigateur. Lorsque j'imprime dans la console, il s'affiche correctement.

Mon code JSF est:

<f:view> 
    <h:form binding="#{jsfSocketClient.form}"> 
     <a4j:keepAlive beanName="jsfSocketClient"/> 
     <h:outputText binding="#{jsfSocketClient.outputMessageBinding}"/> 
     <br/> 
     <h:inputText value="#{jsfSocketClient.inputFromUser}"/> 
     <br/> 
     <h:commandButton action="#{jsfSocketClient.sendMessage}" value="Send"/> 
    </h:form> 
</f:view> 

Et mon code java est:

public HtmlForm getForm() { 
    try { 
     socket = new Socket("192.168.1.115", 4444); 
     response = "Connection Success"; 
     outputMessageBinding.setValue("Connection Success"); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response = "You must first start the server application (YourServer.java) at the command prompt."; 
     outputMessageBinding.setValue(response); 
    } 
    return form; 
} 

public String sendMessage() { 
    outputMessageBinding.setValue(""); 
    try { 
     //String str = "Hello!\n"; 
     out.println(getInputFromUser()); 
     try { 
      String line = in.readLine(); 
      outputMessageBinding.setValue(line); 
      System.out.println("Text received :" + line); 
     } catch (IOException e) { 
      outputMessageBinding.setValue(e.getMessage()); 
      System.out.println("Read failed"); 
      System.exit(1); 
     } 
     //response = result.toString(); 

     if (getInputFromUser().equalsIgnoreCase("bye")) { 
      socket.close(); 
     } 
    } catch(Exception e) { 
     outputMessageBinding.setValue(e.getMessage()); 
     e.printStackTrace(); 
    } 
    return ""; 
} 

Quand je charge la page JSF, si le serveur est connecté 'Connexion Succès' est prise correctement, si pas connecté le message d'erreur est affiché correctement. Lorsque j'essaie d'afficher le message du serveur à l'écran, il ne s'affiche pas. Comment puis-je réparer cela?

Mise à jour Si je crée un nouveau composant de texte en sortie et que vous définissez le message du serveur comme valeur, le message Serveur s'affiche correctement. Je veux savoir pourquoi la liaison n'a pas fonctionné dans mon cas?

Répondre

2

L'ouverture de nouvelles sockets à partir d'une page JSF/Web est un anti-pattern majeur. Pourquoi veux-tu faire cela? Etes-vous au courant de toutes les implications/limitations/risques/problèmes?

Mise à jour:

Création des prises de pages web a plusieurs implications en ce qui concerne la performance et la sécurité.

Si vous souhaitez simplement vous exercer aux sockets Java, la méthode la plus simple consiste à utiliser des clients en ligne de commande. http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html

Pas besoin d'ajouter une complexité supplémentaire avec JSF ou toute autre technologie Web. Vous pouvez avoir des sockets sans serveur Web. (En fait, les prises existaient bien avant http).

+0

Merci d'avoir regardé ma question. Je pratique des applications socket en Java. Donc, pour commencer, j'ai créé un client basé sur le Web basé sur JSF. Vouliez-vous dire que créer un client socket basé sur le Web est risqué? Je ne suis pas au courant des problèmes ici. – mvg

+0

Tous les liens vers la liste des problèmes seront utiles – mvg

+0

Ok, je vais aller avec vous. Mais mon problème est basé sur JSF. Y a-t-il une solution pour ça? – mvg