Question

Je dois appeler un appel de servlet pour une automatisation d'une applet Java en utilisant c #. Qu'est-ce que l'applet java est-il appelle un servlet à l'aide d'un objet de connexion d'URL.

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

Le problème est que je besoin de simuler cela en utilisant c #. Je crois que l'objet de contrepartie serait 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();

Comment puis-je écrire la chaîne comme une chaîne de java sérialisé? Y at-il ici solution de contournement? Selon la documentation de ObjectOutputStream en Java, il sérialiser l'objet, sauf pour le type primitif. Je sais que chaîne est classe, donc il ne serialzie comme un objet ou d'un cas particulier?

J'ai essayé une solution, je l'ai importé le IKVM (http://www.ikvm.net/) machine virtuelle java dans ma référence et essaie d'utiliser la bibliothèque de java.io en Java. Unforunately, lorsque le constructeur ObjectInputStream est appelé, un « en-tête de flux non valide » est levée.

Voici mon code modifié:

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)
Était-ce utile?

La solution 2

j'ai enfin pu obtenir ce travail.

Le problème est à la lecture des données dans .NET au lieu d'utiliser StreamReader, je dois utiliser l'objet flux immédiatement. Quoi qu'il en soit juste laisser ici au cas où il aide les autres à leur problème:

code incorrect:

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

code correct:

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

Autres conseils

Si vous avez le contrôle sur la sérialisation / désérialisation du côté Java, votre meilleur pari est d'utiliser un protocole de sérialisation multiplateformes tels que Buffers Protocole. C ++, Java et Python:

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

Pour .NET, Jon Skeet a écrit un port:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top