c# отправляют, получают объект по сети?

Я работаю над проектом сервера/клиента. Клиент будет просить у сервера информацию, и сервер передаст их обратно клиенту

Информация может быть строкой, числом, массивом, списком, arraylist или любым другим объектом. Решение, которое я нашел до сих пор, состоит в том, чтобы сериализировать объект (данные) и отправить его, затем десериализовывают его для обработки.

Вот серверный код:

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

вот клиентский код, который должен возвратить объект

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;

        }

Я должен знать, что польза сериализирует/сериализирует и как интегрировать ее в решение выше.

5
задан FrankerZ 24 October 2016 в 10:43
поделиться

2 ответа

Обновление (8 лет спустя)

Существует несколько способов отправки данных по сети. Обычно это включает в себя некоторую форму сериализации на одном конце и десериализацию на другом. Хотя мой исходный ответ будет работать, я думаю, что gRPC будет лучшим решением, поскольку он позволяет клиенту и сервер должен быть написан на разных языках. Более того, он предлагает возможности потоковой передачи и множество плагинов сообщества (для показателей, трассировки, ведения журнала и т. Д.) По возможности старайтесь не изобретать колесо заново ...


Исходный ответ

рассматривали ли вы возможность использования служб Windows Communication Foundation ? WCF предоставляет расширяемый API, который поддерживает наиболее распространенные протоколы из коробки. Более того, WCF имеет встроенную сериализацию / десериализацию.

Если вы не хотите использовать WCF, вы можете использовать двоичную сериализацию .

Это пример использования двоичной сериализации:

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

Вот вся статья о двоичной сериализации .

-Павел

11
ответ дан 18 December 2019 в 14:43
поделиться

Вы можете сериализовать свои объекты в json, используя JavaScriptSerializer .. Он очень легкий и простой в использовании. Только не забудьте добавить ссылку на System.Web.Extensions.dll

, например:

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

и в другом классе

var js = new JavaScriptSerializer();
var serializedData = js.Serialize(dataObject);
2
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: