對於學校項目,我必須創建一個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
更好?你有問題的答案嗎? – rynojvr
@rynojvr:絕對沒有理由不禮貌 - 這只是一個重要的提示! – home