【发布时间】:2012-06-11 21:40:35
【问题描述】:
对于一个学校项目,我必须创建一个能够为 .NET 客户端提供服务的 Java 服务器,该客户端具有对 WSDL 的服务引用。我有 .NET 客户端代码:
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() 方法。第二个构造一个与内容长度相同的字符数组,然后从流中读取单个字节并将它们转换为字符。
如图所示,当我尝试在一次执行中运行具有多个请求的 .NET 客户端时,问题就出现了。第一个请求没有任何明显的问题。当第二个进来时,服务器读取标题,获取内容长度并构造数组。然而,当需要从套接字读取时,程序只是等待。使用 char 数组方法,我了解到它在读取第一个值时会等待。一旦过了一分钟,.NET 就会超时,程序的其余部分就会中断。
但是,如果我让服务器保持运行,并且每次执行 .NET 客户端只有一个请求,那么一切都很好;响应按原样返回。
我已经尝试了一些解决方案:
- 为每个请求创建一个新的 MathServiceWSDLClient
- 将每个请求放在自己的 using() 块中。
- 同时执行两个相同的请求:两个 Multiply() 或 Add() 请求。
感谢任何帮助。谢谢大家。 ~Ryno Janse van Rensburg
【问题讨论】:
-
更好?你有这个问题的答案吗?
-
@rynojvr:绝对没有理由粗鲁——这只是一个重要的提示!
标签: c# java web-services soap