Читать в XML для файла Java - PullRequest
       2

Читать в XML для файла Java

0 голосов
/ 31 октября 2011

У меня есть сервер, который принимает запрос на WSDL и отсылает XML-строку WSDL построчно.Я знаю, что запрос принимается и обрабатывается правильно, потому что у меня есть сервер, распечатывающий 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: сокет закрытв 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) в sun.nio.cs.StreamDecoder.read (StreamDecoder.java:158) в java.io.InputStreamReader.read (InputStreamReader.java:167) в java.io.BufferedReader.заполните (BufferedReader.java:136) в java.io.BufferedReader.readLine (BufferedReader.java:299) в 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();
        }
    }

}

1 Ответ

2 голосов
/ 31 октября 2011

Похоже, вы закрываете Socket перед чтением с socketReader. Вы должны полностью прочитать результаты этого объекта перед закрытием Socket. Это весь код? Вы также можете попробовать добавить socketWriter.flush() до его закрытия.

Edit:

Я заметил, что вы отправляете на сервер запрос GET, предположительно намереваясь выдать HTTP GET? Если это так, ваш запрос искажен. Попробуйте это:

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

Возможно, вам лучше использовать java.net.URLConnection или Apache HttpClient для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...