2010-11-26 25 views
5

J'essaie de convertir ce scriptlet code en classe JSF.convertir du scriptlet au problème de bean géré par JSF

Le code de la vue

<f:view> 
<h:form binding="#{jsfSocketClient.form}"> 
    <h:outputText binding="#{jsfSocketClient.text}"/> 

</h:form> 
</f:view> 

et le code java

private HtmlForm form = new HtmlForm(); 
private HtmlOutputText text = new HtmlOutputText(); 

public HtmlForm getForm() 
{ 
    System.out.println("instance: "+FacesContext.getCurrentInstance().getResponseWriter()); 
    ResponseWriter writer = (FacesContext.getCurrentInstance()).getResponseWriter(); 
    try{ 

     int character; 
     Socket socket = new Socket("127.0.0.1", 8765); 

     InputStream inSocket = socket.getInputStream(); 
     OutputStream outSocket = socket.getOutputStream(); 

     String str = "Hello!\n"; 
     byte buffer[] = str.getBytes(); 
     outSocket.write(buffer); 
     char characters = 0; 
     while ((character = inSocket.read()) != -1) { 
      text.setValue((char)character); 
      //writer.write((char)character); 
      //characters += (char)character; 
     } 
     //text.setValue(characters); 
     if(str.equalsIgnoreCase("bye")) 
       { 
        socket.close(); 
       } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     text.setValue("You must first start the server application (YourServer.java) at the command prompt.");   
    } 
    return form; 
} 

Quand je lance le code scriptlet, je reçois la réponse que "Le serveur a ceci: Bonjour!"

Lorsque je lance le code JSF, je ne reçois pas cette réponse. S'il vous plaît corriger mon erreur

Merci d'avance

+0

comment est-ce que vous _run_ le code jsf ..? – Bozho

+0

Qu'est-ce que vous obtenez à la place? –

+0

@tomas un caractère inconnu comme ceci ঠ – mvg

Répondre

3

Je corrige ma réponse. Le problème est le traitement du flux d'entrée. Voici le code fixe:

String response = ""; 
    try { 

     Socket socket = new Socket("127.0.0.1", 8765); 

     Reader reader = new InputStreamReader(socket.getInputStream()); 
     OutputStream outSocket = socket.getOutputStream(); 

     String str = "Hello!\n"; 
     byte buffer[] = str.getBytes(); 
     outSocket.write(buffer); 

     CharArrayWriter result = new CharArrayWriter(); 
     char[] buf = new char[4096]; 
     int charsRead = 0; 
     while ((charsRead = reader.read(buf)) != -1) { 
      result.write(buf, 0, charsRead); 
     } 
     response = result.toString(); 

     if (str.equalsIgnoreCase("bye")) { 
      socket.close(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response = "You must first start the server application (YourServer.java) at the command prompt."; 
    } 
    text.setValue(response); 
+0

Merci pour la correction. Je vais travailler avec et revenir – mvg

+0

Je pense que le problème principal était en fait le traitement de socket d'entrée, dans lequel il mettait pour chaque octet le champ de valeur, avec une conversion directe à un caractère. Le code @morja traite l'InputStream de manière correcte, donc mon upvote pour cette réponse. –

+1

True. J'ai corrigé l'erreur de code (buffer/buf), merci pour la remarque. – morja