학교 프로젝트의 경우 WSDL에 대한 서비스 참조가있는 .NET 클라이언트를 서비스 할 수있는 Java 서버를 만들어야합니다.SOAP 웹 서비스를 사용할 때 이상한 오류
이Scanner sc = new Scanner(socket.getInputStream());
boolean clientExpectContinue = false;
int contentLength = -1;
String line;
while (!(line = sc.nextLine()).isEmpty()) {
System.out.println(line);
if (line.startsWith("Content-Length")) {
String[] elements = line.split(": ");
contentLength = Integer.parseInt(elements[1]);
} else if (line.startsWith("Expect")) {
clientExpectContinue = true;
}
}
int notEmpties = 0;
byte[] soapEnvelopeData = new byte[contentLength];
char[] soapChars = new char[contentLength];
for (int i = 0; i < contentLength; i++) {
soapChars[i] = (char) socket.getInputStream().read();
if (i == 0)
System.out.println("DFSDFSDf");
}
// System.out.println(socket.getInputStream().read(soapEnvelopeData));
System.out.println(soapEnvelopeData.length);
File file = new File("tempEnvelope.txt");
FileOutputStream fileOut = new FileOutputStream(file);
// fileOut.write(soapEnvelopeData);
System.out.println("Content!");
System.out.println(new String(soapChars));
fileOut.write(new String(soapChars).getBytes());
fileOut.flush();
fileOut.close();
/* Some fancy SOAP and Reflection stuff that works */
는 다음 서버의 요지가 될 때 : 나는 또한 자바 서버 작성한
using (var client = new MathServiceWSDLClient())
{
Console.WriteLine("Multiplying " + Num1 + " and " + Num2 + ": " + client.Multiply(Num1, Num2));
Console.WriteLine("Adding" + Num1 + " and " + Num2 + ": " + client.Add(Num1, Num2));
}
: 나는 .NET 클라이언트 코드가, 그것은 incomming 요청을 얻는다는 헤더를 읽어 콘텐츠 길이를 찾습니다. 이것을 파싱하고 저장합니다. 여기에는 두 가지 버전이 있습니다. 첫 번째는 내용 길이와 동일한 크기의 바이트 배열을 생성하고이 배열을 매개 변수로 socket.getInputStream(). read() 메서드에 전달합니다. 두 번째는 동일한 길이의 내용을 char 배열로 생성 한 다음 스트림에서 개별 바이트를 읽고 char로 변환합니다.
그림과 같이 한 번에 여러 요청으로 .NET 클라이언트를 실행하려고하면 문제가 발생합니다. 첫 번째 요청은 눈에 띄는 문제없이 진행됩니다. 두 번째 서버가 들어 오면 서버는 헤더를 읽고 내용 길이를 가져 와서 배열을 만듭니다. 그러나 소켓에서 읽을 시간이되면 프로그램이 기다립니다. char 배열 메소드를 사용하여, 나는 첫 번째 값을 읽을 때까지 기다리는 것을 알 수있었습니다. 1 분이 만료되면 .NET이 시간 초과되고 나머지 프로그램이 중단됩니다.
그러나 서버를 실행 상태로두고 .NET 클라이언트 실행 당 하나의 요청 만 있으면 모든 것이 잘됩니다. 응답은 꼭해야만합니다.
는 이미 몇 가지 솔루션을 시도 :
- 가 자신의 사용() 블록의 모든 요청을 두는 모든 요청
- 에 대한 새로운 MathServiceWSDLClient 만들기.
- 한 번에 두 개의 동일한 요청 수행 : 두 개의 Multiply() 또는 Add() 요청.
도움을 주시면 감사하겠습니다. 모두에게 미리 감사드립니다. ~ Ryno Janse van Rensburg
더 나은가요? 문제에 대한 답변이 있으십니까? – rynojvr
@rynojvr : 무례한 이유가 전혀 없습니다. 이것은 중요한 힌트였습니다! – home