私は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();
}
}
}
これはすべてのコードではありませんが、残りはこの特定の部分に関連するとは思われません。私のsocketReaderはautoflushに設定されています。クローズについては、socketWriterをすぐに閉じないと、リクエストがサーバーに書き込まれず、何も返されません。それは、ソケットが閉じられるまでそこに掛かるだけです。 –
私は今問題があると思う。私は私の答えを修正しています。 – laz
ご迷惑をおかけして申し訳ありませんが、私はサーバーを開発しました。ちょっと複雑ですが、基本的にはクライアントからの入力を受け取り、 "GET"で始まる場合はスペースの後にファイル名として解析します。サーバー(サーバー)はそのファイル名をsendResponse()に渡します。メソッドは、ファイルを1行ずつ読み込み、それをサーバーソケットの出力に書き込みます。クライアントはその行を行単位で読み込み、その行を新しいファイルに書き込んで、DOMで使用するXMLファイルを作成する必要があります。 –