我需要使用c#调用servlet调用以实现java applet的自动化。 java applet是什么,它使用URL Connection对象调用servlet。
URL servlet = new URL(servletProtocol, servletHost, servletPort, "/" + ServletName);
URLConnection con = servlet.openConnection();
con.setDoOutput(true);
ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream());
// Write several parameters strings
out.writeObject(param[0]);
out.writeObject(param[1]);
out.flush();
out.close();
问题是我需要使用c#来模拟这个问题。我相信对应的对象是HttpWebRequest
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(servletPath);
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();
// Send the data.
newStream.Write(param[0],0,param[0].length);
newStream.Write(param[1],0,param[1].length);
newStream.Close();
如何将字符串写为序列化的java字符串?这里有解决方法吗?根据java中ObjectOutputStream的文档,它序列化了除基本类型之外的对象。我知道String是类,所以它像对象或特殊情况一样串行吗?
我尝试了一个解决方案,我在我的参考中导入了IKVM(http://www.ikvm.net/)java虚拟机,并尝试在Java中使用java.io库。不幸的是,当调用ObjectInputStream构造函数时,会抛出“无效的流头”。
这是我改变的代码:
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();
List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
while (sr.Peek() >= 0)
{
lByte.Add((byte)sr.Read());
}
}
byte[] bArr = lByte.ToArray();
ObjectInputStream inputStream = null;
try
{
//Construct the ObjectInputStream object
inputStream = new ObjectInputStream(new ByteArrayInputStream(bArr));
Object obj = null;
while ((obj = inputStream.readObject()) != null)
{
string objStr = obj as string;
}
}
catch (java.lang.Exception ex)
答案 0 :(得分:1)
如果您可以控制Java端的序列化/反序列化,最好的办法是使用跨平台的序列化协议,例如Protocol Buffers。对于C ++,Java和Python:
http://code.google.com/p/protobuf/
对于.NET,Jon Skeet写了一个端口:
答案 1 :(得分:1)
我终于得到了这个工作。
问题是在.NET中读取数据而不是使用StreamReader,我需要立即使用Stream对象。无论如何只是把它留在这里,以防其他人解决他们的问题:
错误的代码:
List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
while (sr.Peek() >= 0)
{
lByte.Add((byte)sr.Read());
}
}
正确代码:
byte[] buffer = new byte[1000];
using (Stream sr = myRequest.GetResponse().GetResponseStream())
{
sr.Read(buffer, 0, 1000);
}