Hola, finalmente encontré cómo enviar objetos entre 2 programas cuyos nombres sean distintos. Hay que hacerlo serializando en XML en vez de en binario, aquí dejo el código por si alguien en el futuro tiene mi mismo problema.
He seguido el siguiente link, solo que con algunas modificaciones:
http://www.codeproject.com/KB/cs/objserial.aspxCódigo para el cliente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Xml.Serialization;
using System.Data.SqlTypes;
namespace Cliente
{
class Program
{
static void Main(string[] args)
{
RunClient("127.0.0.1", 6666);
}
public static void RunClient(string SrvIP, int SrvPort)
{
object obj = null;
XmlSerializer xmls
= new XmlSerializer
(typeof(Employee
)); try
{
var tcpclnt
= new TcpClient
(); Console.WriteLine("Connecting.....");
tcpclnt.Connect(SrvIP, SrvPort);
Console.WriteLine("Connected");
Stream stm = tcpclnt.GetStream();
Employee mp
= new Employee
(); mp.EmpId = 10;
mp.EmpName = "Omkumar";
byte[] b
= new byte[10000]; Stream st
= new MemoryStream
(b
);
Console.WriteLine("Enviando Informacion...");
xmls.Serialize(st, mp);
stm.Write(b, 0, b.Length);
var bb
= new byte[10000];
var k = stm.Read(bb, 0, bb.Length);
for (var i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
Console.ReadLine();
tcpclnt.Close();
}
catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
Console.ReadLine();
}
}
}
}
Código para el Servidor
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Xml.Serialization;
using System.Data.SqlTypes;
namespace Servidor
{
class Program
{
static void Main(string[] args)
{
RunServer("127.0.0.1",6666);
}
public static void RunServer(string SrvIP, int SrvPort)
{
try
{
var ipAd = IPAddress.Parse(SrvIP);
XmlSerializer xmls
= new XmlSerializer
(typeof(Employee
));
/* Initializes the Listener */
if (ipAd != null)
{
var myList
= new TcpListener
(ipAd, SrvPort
);
/* Start Listening at the specified port */
myList.Start();
Console.WriteLine("El servidor se está ejecutando en el puerto: " + myList.LocalEndpoint);
Console.WriteLine("Esperando conexion...");
var hacen
= new ASCIIEncoding
(); Employee mp = null;
while (true)
{
Socket s = myList.AcceptSocket();
Console.WriteLine("Conexion aceptada de: " + s.RemoteEndPoint);
Stream stream
= new MemoryStream
(b
); int k = s.Receive(b);
Console.WriteLine("Informacion recibida. Deserializando...");
mp = (Employee)xmls.Deserialize(stream);
stream.Close();
Console.WriteLine("Deserializado correcto");
s.Send(hacen.GetBytes("Mensaje recibido"));
Console.WriteLine("Employee Id: {0}", mp.EmpId.ToString());
Console.WriteLine("Employee Name: {0}", mp.EmpName);
s.Close();
Console.ReadLine();
}
myList.Stop();
}
}
catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
}
}
}
}
Este es el codigo para la clase que ambos programas deben de tener:
using System;
namespace Cliente
{
[Serializable()] //Set this attribute to all the classes that you define to be serialized
public class Employee
{
public int EmpId;
public string EmpName;
//Default constructor
public Employee()
{
EmpId = 10;
EmpName = "Periquito";
}
}
}
Lo he copiado casi en el momento en que me ha funcionado, así que puede que haya código que sobre y demás, pero funcionar funciona.
Saludos.