2011-10-31 16 views
0

私はWSDLの要求を受け取り、WSDLのXMLを1行ずつ送り返すサーバーを持っています。サーバーのソケットに書き込んでいるときにサーバーがXMLをコンソールに出力しているので、要求が正しく受信されて処理されていることがわかります。今私の問題は、私のクライアントアプリケーションはXMLで読み込み、xmlを使ってメソッドのシグネチャを出力するはずです。 DOM/DocumentBuilderを使用してWSDLからメソッドシグネチャの一部を取得しますが、最初に読み込んだ行をファイルに入れる必要があります。これどうやってするの?現在、私は、このようにそれをやろうとしている:XMLでファイルを読み込み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(); 
     } 

しかし、このエラーを取得しています: "?MathServices WSDL" を要求する

クライアントは... java.net.SocketExceptionがを:ソケットは、javaで を閉じました.net.SocketInputStream.socketRead0(ネイティブメソッド) java.net.SocketInputStream.read(SocketInputStream.java:129) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio。 cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)java.io.BufferedReader.readLineでjava.io.BufferedReader.fill(BufferedReader.java:136) でjava.io.InputStreamReader.read(InputStreamReader.java:167) (BufferedReader.java:299) ででjava.io.BufferedReader.readLine client.Client.mainで(BufferedReader.java:362) (Client.java:50)

EDIT:サーバーコード

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(); 
     } 
    } 

} 

答えて

2

あなたは閉じているように見えますSocketから読み取る前にsocketReaderSocketを閉じる前に、そのオブジェクトから結果を完全に読み取る必要があります。これはすべてコードですか?また、閉じる前にsocketWriter.flush()を追加することもできます。

編集:

私はあなたがおそらくHTTP GETを発行しようとする、サーバーへのGETリクエストを送信していることに気づきましたか?もしそうなら、あなたの要求は不正です。これを試してみてください:

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

おそらく、この作業のためにjava.net.URLConnectionまたはApacheのHttpClientを使用したほうが良いでしょう。

+0

これはすべてのコードではありませんが、残りはこの特定の部分に関連するとは思われません。私のsocketReaderはautoflushに設定されています。クローズについては、socketWriterをすぐに閉じないと、リクエストがサーバーに書き込まれず、何も返されません。それは、ソケットが閉じられるまでそこに掛かるだけです。 –

+0

私は今問題があると思う。私は私の答えを修正しています。 – laz

+0

ご迷惑をおかけして申し訳ありませんが、私はサーバーを開発しました。ちょっと複雑ですが、基本的にはクライアントからの入力を受け取り、 "GET"で始まる場合はスペースの後にファイル名として解析します。サーバー(サーバー)はそのファイル名をsendResponse()に渡します。メソッドは、ファイルを1行ずつ読み込み、それをサーバーソケットの出力に書き込みます。クライアントはその行を行単位で読み込み、その行を新しいファイルに書き込んで、DOMで使用するXMLファイルを作成する必要があります。 –

関連する問題