2011-10-31 177 views
0

我有一个服务器,它接受一个WSDL请求并逐行回发WSDL的XML。我知道请求正在被正确接收和处理,因为当服务器写入服务器套接字时,服务器会将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) 在sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 在sun.nio。 cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)在java.io.BufferedReader.readLine(BufferedReader.java:299) at(java.io.BufferedReader.java:136)上的java.io.InputStreamReader.read(InputStreamReader.java:167) (BufferedReader.java:136) java.io.BufferedReader.readLine(BufferedReader.java:362) 在client.Client.main(Client.java:50)

编辑:服务器代码

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

它看起来像你关闭SocketsocketReader读取之前。在关闭Socket之前,您必须完全阅读该对象的结果。这是所有的代码?在关闭之前,您也可以尝试添加socketWriter.flush()

编辑:

我注意到,您要发送GET请求到服务器,想必打算发出HTTP 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()方法逐行读取文件,然后将其写入服务器套接字的输出。然后,客户端应该逐行读取并将行写入一个新文件,制作一个供DOM使用的XML文件。 –