繁体   English   中英

读入XML以归档Java

[英]Read in XML to file Java

我有一个服务器,它接受WSDL请求并逐行发送回WSDL的XML。 我知道请求正在被正确接收和处理,因为我让服务器在写入服务器套接字时将XML打印到控制台。 我现在的问题是我的客户端应用程序应该在xml中读取,然后使用xml打印出方法签名。 我将使用DOM / DocumentBuilder从WSDL中获取方法签名的各个部分,但我需要先将读入的行放入文件中。 我怎样才能做到这一点? 目前我正在尝试这样做:

        //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:socket在java.net.SocketInputStream.socketRead0(Native Method)处关闭,位于sun.nio的java.net.SocketInputStream.read(SocketInputStream.java:129)。 cs.StreamDecoder.readBytes(StreamDecoder.java:264)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)at the sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)at java.io .inputStreamReader.read(InputStreamReader.java:167)位于java.io.BufferedReader.readLine(BufferedReader.java:299)的java.io.BufferedReader.fill(BufferedReader.java:136)java.io.BufferedReader.readLine( BufferedReader.java:362)at 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();
        }
    }

}

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

编辑:

我注意到你正在向服务器发送GET请求,可能是为了发出HTTP GET 如果是这样,您的请求就会出错。 尝试这个:

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

使用java.net.URLConnection或Apache HttpClient完成此任务可能会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM