簡體   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