Frage

Ich brauche für eine Automatisierung eines Java-Servlet Aufruf aufrufen Applet mit c #. Was das Java-Applet ist es ein Servlet ruft ein URL Connection-Objekt verwendet wird.

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

Das Problem ist, ich brauche dies mit c # zu simulieren. Ich glaube, dass das Gegenstück Objekt wäre 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();

Wie schreibe ich die Zeichenfolge als serialisierte Java-String? Gibt es eine Abhilfe hier? Gemäß der Dokumentation von Object in java, serialisiert es das Objekt mit Ausnahme vom Urtyp. Ich weiß, dass String-Klasse ist, so dass es serialzie es wie ein Objekt oder einen Sonderfall?

Ich habe eine Lösung versucht, habe ich die IKVM importiert (http://www.ikvm.net/) Java Virtual Machine in meiner Referenz und ich versuche, die java.io Bibliothek in Java zu verwenden. Unforunately, wenn der Object Konstruktor aufgerufen wird, wird ein "invalid Stream-Header" geworfen.

Hier ist mein geändertener Code:

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)
War es hilfreich?

Lösung 2

Ich habe endlich das zur Arbeit zu kommen.

Das Problem ist, auf die Daten in .NET Lesen statt mit Stream, muss ich sofort das Stream-Objekt verwenden. Wie auch immer es gerade hier bei Verlassen sie andere mit ihrem Problem helfen:

Falscher Code:

List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
    while (sr.Peek() >= 0)
    {
        lByte.Add((byte)sr.Read());
    }
}

Die richtige Code:

byte[] buffer = new byte[1000];
using (Stream sr = myRequest.GetResponse().GetResponseStream())
{
    sr.Read(buffer, 0, 1000);
}

Andere Tipps

Wenn Sie die Kontrolle über die Serialisierung / Deserialisierung auf der Seite Java haben, Ihre beste Wette ist ein Cross-Plattform-Serialisierung Protokoll wie Protocol Buffers zu verwenden. Für C ++, Java und Python:

http://code.google.com/p/protobuf/

Für .NET Jon Skeet schrieb einen Port:

http://code.google.com/p/protobuf-net/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top