Data-Base Data-Base - 1 month ago 8
C# Question

c# send receive object over network?

I'm working on a server/client project. The client will be asking the server for info and the server will send them back to the client

The info may be string, number, array, list, arraylist or any other object. The solution I found so far is to serialize the object (data) and send it then de-serialize it to process.

Here is the server code:

public void RunServer(string SrvIP,int SrvPort)
{
try
{
var ipAd = IPAddress.Parse(SrvIP);


/* Initializes the Listener */
if (ipAd != null)
{
var myList = new TcpListener(ipAd, SrvPort);

/* Start Listeneting at the specified port */
myList.Start();

Console.WriteLine("The server is running at port "+SrvPort+"...");
Console.WriteLine("The local End point is :" + myList.LocalEndpoint);
Console.WriteLine("Waiting for a connection.....");


while (true)
{
Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

var b = new byte[100];
int k = s.Receive(b);
Console.WriteLine("Recieved...");
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(b[i]));
string cmd = Encoding.ASCII.GetString(b);
if (cmd.Contains("CLOSE-CONNECTION"))
break;
var asen = new ASCIIEncoding();

// sending text
s.Send(asen.GetBytes("The string was received by the server."));

// the line bove to be modified to send serialized object?


Console.WriteLine("\nSent Acknowledgement");
s.Close();
Console.ReadLine();
}
/* clean up */

myList.Stop();
}
}
catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
}
}


here is the client code that should return an object

public object runClient(string SrvIP, int SrvPort)
{
object obj = null;
try
{
var tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");

tcpclnt.Connect(SrvIP, SrvPort);
// use the ipaddress as in the server program


Console.WriteLine("Connected");
Console.Write("Enter the string to be transmitted : ");

var str = Console.ReadLine();
Stream stm = tcpclnt.GetStream();

var asen = new ASCIIEncoding();
if (str != null)
{
var ba = asen.GetBytes(str);
Console.WriteLine("Transmitting.....");

stm.Write(ba, 0, ba.Length);
}

var bb = new byte[2000];

var k = stm.Read(bb, 0, bb.Length);

string data = null;

for (var i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));

//convert to object code ??????

Console.ReadLine();

tcpclnt.Close();
}

catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
}

return obj;

}


I need to know a good serialize/serialize and how to integrate it into the solution above.

Answer

have you considered using Windows Communication Foundation services? WCF gives you extensible API which supports the most common protocols out of the box. And what is more WCF has built in serialization/deserialization.

If you do don't want to use WCF then you can use Binary Serialization.

This is a sample usage of the binary serialization:

private Stream SerializeMultipleObjects()
{ 
    // Initialize a storage medium to hold the serialized object
    Stream stream = new MemoryStream();

    // Serialize an object into the storage medium referenced by 'stream' object.
    BinaryFormatter formatter = new BinaryFormatter();

    // Serialize multiple objects into the stream
    formatter.Serialize( stream, obOrders );
    formatter.Serialize( stream, obProducts );
    formatter.Serialize( stream, obCustomers );

    // Return a stream with multiple objects
    return stream; 
}

private void DeSerializeMultipleObject(Stream stream)
{
    // Construct a binary formatter
    BinaryFormatter formatter = new BinaryFormatter();

    // Deserialize the stream into object
    Orders     obOrders    = (Orders)formatter.Deserialize( stream );
    Products   obProducts  = (Products)formatter.Deserialize( stream );
    Customers  obCustomers = (Customer)formatter.Deserialize( stream );
}

Here is the entire article about binary serialization.

-Pavel

Comments