开发者

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("Connect开发者_如何学Cing.....");

                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.


Update (8 years later)

There are multiple ways to send data over the network. It usually involves some form of serialization on one end and deserialization on the other. Although, my original answer would work, I think gRPC would be a better solution as it allows the client and the server to be written in different languages. What is more, it offers streaming capabilities and a lot of community plugins (for metrics, tracing, logging etc.) Whenever possible, try not to re-invent the wheel...


Original 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


You could serialize your objects into json, using JavaScriptSerializer.. It's very lightweight, and easy to use. Just don't forget to add a reference to System.Web.Extensions.dll

e.g.:

var js = new JavaScriptSerializer();
var data = js.Deserialize<MyClass>(receivedString);

and in the other class

var js = new JavaScriptSerializer();
var serializedData = js.Serialize(dataObject);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜