Domanda

ho bisogno di chiamare una chiamata servlet per l'automazione di un applet Java utilizzando c #. Che l'applet Java è che definisce un servlet utilizzando un oggetto Connection 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();

Il problema è che ho bisogno di simulare questo utilizzando c #. Credo che l'oggetto controparte sarebbe 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();

Come faccio a scrivere la stringa come una stringa Java serializzato? C'è qualche soluzione qui? Secondo la documentazione di ObjectOutputStream in Java, serializzare l'oggetto ad eccezione di tipo primitivo. So String è di classe, quindi vuol serialzie è come un oggetto o di qualche caso particolare?

ho cercato una soluzione, ho importato il Java Virtual Machine IKVM (http://www.ikvm.net/) nel mio riferimento e sto cercando di utilizzare la libreria java.io in Java. Unforunately, quando il costruttore ObjectInputStream si chiama, "un colpo di testa flusso non valido" è gettato.

Ecco il mio codice alterato:

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)
È stato utile?

Soluzione 2

Alla fine ho avuto modo di ottenere questo al lavoro.

Il problema è sulla lettura dei dati in .NET invece di utilizzare StreamReader, ho bisogno di usare l'oggetto Stream immediatamente. Comunque appena lasciato qui nel caso in cui aiuta gli altri con il loro problema:

Codice errato:

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

Una corretta Codice:

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

Altri suggerimenti

Se si ha il controllo sulla serializzazione / deserializzazione sul lato Java, la cosa migliore è quello di utilizzare un protocollo di serializzazione cross-piattaforma come buffer protocollo. Per C ++, Java e Python:

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

Per .NET, Jon Skeet ha scritto una porta:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top