2012-06-11 9 views
0

학교 프로젝트의 경우 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

+0

더 나은가요? 문제에 대한 답변이 있으십니까? – rynojvr

+1

@rynojvr : 무례한 이유가 전혀 없습니다. 이것은 중요한 힌트였습니다! – home

답변

0

.net은 아마도 후속 요청을 위해 소켓을 열어 두었을 것입니다. 서버 관련 자바 코드에 이와 관련된 버그가있을 수 있습니다.

Java 서버 코드 대신 프레임 워크를 사용할 수 있습니까? 나는 이것을 강력히 추천하며 주저없이 rmbedded Jetty를 추천합니다. 이는 Java의 소켓 레벨에서 작업하지 않아도된다는 것을 의미합니다. Jetty가 모든 복잡한 문제를 처리하도록 할 수 있습니다.

+0

서버 코드의 끝에서 소켓을 닫습니다. 그리고 말했듯이, 서버는 두 번째 요청의 헤더를 얻습니다. 따라서 .NET은 적어도 두 번째 요청의 헤더를 보냅니다. 나는 프레임 워크를 사용하는 것을 선호하지만, SOAP과 파싱의 문제로 고생 할 과제의 요지. 내 손이 소켓을 사용하여 묶여 있습니다. – rynojvr

+0

전체 서버 코드를 게시하지 않았으므로 도움을 드릴 확신이 없습니다. 프레임 워크 제안은 SOAP 구문 분석에서 당신을 제거하는 것이 아니기 때문에 여전히 그렇게해야합니다. 그 아이디어는 소켓에서 서블릿으로 레벨을 옮기는 것이 었습니다. 그렇다면 모든 끔찍한 저수준 소켓과 HTTP 물건을 스스로 할 필요는 없습니다. 다른 사람이 그렇게하도록하십시오. Jetty는 간단한 서버를 작성하기에 충분할 때까지 30 분이 소요됩니다. 행운을 빕니다! – davidfrancis

관련 문제