Pregunta

Tengo que llamar a una llamada de servlet para una automatización de un Applet de Java con C #. Lo que el applet de Java es que llama un servlet con un objeto URL de conexión.

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

El problema es que necesito para simular esta usando C #. Creo que el objeto contraparte sería 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();

¿Cómo se escribe la cadena como una cadena de Java serializado? ¿Hay alguna solución aquí? De acuerdo con la documentación de ObjectOutputStream en Java, serializar el objeto a excepción de tipo primitivo. Sé cadena es de clase, por lo que no se serialzie como si fuera un objeto o algún caso especial?

He intentado una solución, he importado el Java Virtual Machine IKVM (http://www.ikvm.net/) en mi referencia y estoy tratando de utilizar la biblioteca java.io en Java. Unforunately, cuando el constructor ObjectInputStream se llama, se emite una "cabecera de transmisión no válida".

Aquí está mi código alterada:

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)
¿Fue útil?

Solución 2

Finalmente conseguí para conseguir que esto funcione.

El problema está en la lectura de los datos en .NET en lugar de utilizar StreamReader, necesito utilizar el objeto Stream de inmediato. De todos modos acaba de salir de aquí en caso de que ayuda a otros con su problema:

Código incorrecto:

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

código correcto:

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

Otros consejos

Si usted tiene el control sobre la serialización / deserialización en el lado de Java, lo mejor es utilizar un protocolo de serialización multiplataforma como Protocol Buffers. Para C ++, Java y Python:

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

Para .NET, Jon Skeet escribió un puerto:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top