2012-06-11 74 views
0

對於學校項目,我必須創建一個Java服務器,該服務器能夠爲具有WSDL服務引用的.NET客戶端提供服務。我有.NET客戶端代碼:使用SOAP Web服務時出現奇怪的錯誤

 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)); 
     } 

我也寫了Java服務器:

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 */ 

服務器的要點如下: 它得到進來的請求,通過讀取頭並找到內容的長度。它分析並保存這個。從這裏有兩個版本。第一個構造一個與內容長度大小相同的字節數組,並將該數組作爲參數傳遞給socket.getInputStream()。read()方法。第二個構造一個char數組,其內容的長度相同,然後從流中讀取單個字節並將它們轉換爲字符。

如圖所示,當我試圖在一次執行中運行帶有多個請求的.NET客戶端時,該問題就會發揮作用。第一個請求沒有任何明顯的問題。當第二個進來時,服務器讀取標題,獲取內容長度並構建數組。然而,當從套接字讀取時,程序只是在等待。使用char數組方法,我可以知道它在讀取第一個值時等待。一分鐘過期後,.NET會超時,程序的其餘部分會中斷。然而,如果我離開服務器運行,並且每次執行.NET客戶端只有一個請求,那麼一切都很好;迴應就像它應該回來一樣。

我已經嘗試了一些解決方案已經:

  • 創建一個新的MathServiceWSDLClient爲每個請求
  • 把在自己使用()塊每一個請求。
  • 一次執行兩個相同的請求:兩個Multiply()或Add()請求。

任何幫助表示讚賞。謝謝大家。 〜Ryno Janse van Rensburg

+0

更好?你有問題的答案嗎? – rynojvr

+1

@rynojvr:絕對沒有理由不禮貌 - 這只是一個重要的提示! – home

回答

0

.net可能會讓套接字爲後續請求保持打開狀態。您的服務器類似的java代碼可能存在一個錯誤。

您是否可以使用框架代替Java服務器代碼?我強烈建議這一點,並毫不猶豫地推薦嵌入式Jetty。這意味着你不必在Java中使用套接字級別 - 你可以讓Jetty處理所有這些複雜事件。

+0

在服務器代碼的末尾,我關閉了套接字。就像我說的,服務器獲取第二個請求的標題,所以.NET至少發送它們。 我非常喜歡使用框架,但分配的重點在於受到SOAP及其解析的影響。我的手被用插座綁起來。 – rynojvr

+0

你還沒有發佈你的整個服務器代碼,所以我不知道我可以幫忙。框架建議不是要將您從SOAP解析中移除,您仍然必須這樣做。這個想法是讓你離開套接字到servlet。那麼你不必自己做所有可怕的低級套接字和HTTP的東西。讓其他人這樣做。 Jetty將花費你半個小時的時間來學習寫足夠簡單的服務器。祝你好運! – davidfrancis

相關問題