2011-10-31 4 views
0

J'ai un serveur qui prend une demande pour un WSDL et renvoie la ligne XML du WSDL ligne par ligne. Je sais que la demande est reçue et traitée correctement parce que le serveur imprime le code XML à la console pendant qu'il écrit sur le socket du serveur. Mon problème en ce moment est que mon application cliente est supposée lire dans le XML et ensuite imprimer des signatures de méthode en utilisant le xml. Je vais utiliser DOM/DocumentBuilder pour obtenir les parties de la ou des signatures de la méthode à partir du WSDL, mais je dois d'abord mettre les lignes lues dans un fichier. Comment puis-je faire ceci? Actuellement, je suis en train de le faire de cette façon:Lire en XML pour le fichier Java

 //request WSDL from server 
     System.out.println("Client requesting \"MathServices?wsdl\"..."); 
     socketWriter.write("GET MathServices?wsdl"); 
     socketWriter.close(); 

     //read XML response into file  
     try { 
      File wsdlXML = new File("MathServices.xml"); 
      FileOutputStream wsdlXmlWriter = new FileOutputStream(wsdlXML); 

      String xmlLine; 
      while((xmlLine = socketReader.readLine()) != null){ 
       wsdlXmlWriter.write(xmlLine.getBytes()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Mais je obtenir cette erreur:

client demandant "MathServices wsdl?" ... java.net.SocketException: socket fermé à java .net.SocketInputStream.socketRead0 (méthode native) à java.net.SocketInputStream.read (SocketInputStream.java:129) à sun.nio.cs.StreamDecoder.readBytes (StreamDecoder.java:264) à sun.nio. cs.StreamDecoder.implRead (StreamDecoder.java:306) à sun.nio.cs.StreamDecoder.read (StreamDecoder.java:158) à java.io.InputStreamReader.read (InputStreamReader.java:167) à java.io.BufferedReader.fill (BufferedReader.java:136) à java.io.BufferedReader.readLine (BufferedReader.java:299) à java.io.BufferedReader.readLine (BufferedReader.java:362) à client.Client.main (Client.java:50)

EDIT: code serveur

package server; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.Scanner; 

public class RequestHandler extends Thread { 

    Object block; 
    ServerSocket serverSocket; 
    BufferedReader socketReader; 
    PrintWriter socketWriter; 

    public RequestHandler(Object block, ServerSocket serverSocket){ 
     this.block = block; 
     this.serverSocket = serverSocket; 
    } 

    @Override 
    public void run() { 
     try{ 
      System.out.println("Waiting for connection..."); 
      Socket clientSocket = serverSocket.accept(); 
      System.out.println("Connection made."); 

      synchronized(block){ 
       System.out.print("Notifying server thread..."); 
       block.notify(); 
       System.out.println("...done"); 
       System.out.println(); 
      } 

      System.out.println("Setting up streams..."); 
      socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));    
      socketWriter = new PrintWriter(clientSocket.getOutputStream(), true); 
      System.out.println("Reading request"); 

      String input; 
      while((input = socketReader.readLine()) != "\n"){ 
       //System.out.println("Input: " +input); 

       if(input.startsWith("GET")){ 
        System.out.println("GET received."); 
        getResource(input); 
       } 
      } 

      socketWriter.close(); 
      socketReader.close(); 
      clientSocket.close(); 

      System.out.println("Streams closed."); 
     }catch(IOException e){ 
      System.out.println("IOException!"); 
      e.printStackTrace(); 
     } 
    } 

    public void getResource(String getRequest){ 
     String[] parts = getRequest.split("\\s+"); 
     String filename = parts[1].substring(1); 

     if(filename.equals("MathServices?wsdl")){ 
      filename = "MathServices.wsdl"; 
     } 
     System.out.println(filename); 
     File resource = new File(filename);    
     sendResponse(resource, 1); 
    } 

    public void sendResponse(File resource, int type){ 
     System.out.println(resource.getAbsolutePath()); 

     Scanner fileReader; 

     try { 
      fileReader = new Scanner(resource); 

      while(fileReader.hasNext()){ 
       String line = fileReader.nextLine(); 
       System.out.println(line); 
       socketWriter.println(line); 
      } 
      socketWriter.println("\n"); 
      System.out.println("end of response"); 
      socketWriter.close(); 

     } catch (FileNotFoundException e) { 
      System.out.println("File not found!"); 
      e.printStackTrace(); 
     } 
    } 

} 

Répondre

2

On dirait que vous fermez la Socket avant de lire socketReader. Vous devez lire entièrement les résultats de cet objet avant de fermer le Socket. Est-ce tout le code? Vous pouvez également essayer d'ajouter socketWriter.flush() avant de le fermer.

Edit:

J'ai remarqué que vous envoyez une demande GET au serveur, sans doute l'intention de délivrer un HTTP GET? Si oui, votre demande est malformée. Essayez ceci:

socketWriter.write("GET /MathServices?wsdl HTTP/1.1\r\n\r\n"); 

Vous seriez probablement mieux d'utiliser java.net.URLConnection ou Apache HttpClient pour cette tâche.

+0

Ce n'est pas tout le code, mais je ne crois pas que le reste soit pertinent pour cette partie en particulier. Mon socketReader est réglé sur autoflush, d'ailleurs. En ce qui concerne la fermeture, si je ne ferme pas le socketWriter, ma requête ne finit jamais d'écrire sur le serveur et rien n'est renvoyé. Il va juste rester là jusqu'à ce que la prise soit fermée. –

+0

Je pense que je vois le problème maintenant. Je modifie ma réponse. – laz

+0

Désolé de ne pas être clair, mais j'ai développé le serveur. C'est un peu compliqué, mais fondamentalement il prend simplement n'importe quelle entrée d'un client et s'il commence par "GET" alors il analyse la partie après l'espace en tant que filename.It (le serveur) passe alors ce nom de fichier à sendResponse() méthode qui lit le fichier ligne par ligne puis l'écrit sur la sortie du socket serveur. Le client devrait alors lire dans cette ligne par la sortie de ligne et écrire les lignes dans un nouveau fichier, en créant un fichier XML à utiliser avec DOM. –