【问题标题】:c# send receive object over network?c# 通过网络发送接收对象?
【发布时间】:2010-04-20 10:17:27
【问题描述】:

我正在开发一个服务器/客户端项目。客户端将向服务器询问信息,服务器会将它们发送回客户端

信息可以是字符串、数字、数组、列表、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;

        }

我需要知道一个好的序列化/序列化以及如何将它集成到上面的解决方案中。

【问题讨论】:

    标签: c# client serialization


    【解决方案1】:

    更新(8 年后)

    有多种方法可以通过网络发送数据。它通常一方面涉及某种形式的序列化,另一方面涉及反序列化。 虽然,我最初的答案会起作用,但我认为gRPC 会是一个更好的解决方案,因为它允许客户端和服务器用不同的语言编写。更重要的是,它提供了流媒体功能和许多社区插件(用于指标、跟踪、日志记录等) 只要有可能,尽量不要重新发明轮子……


    原答案

    您是否考虑过使用Windows Communication Foundation 服务? WCF 为您提供了可扩展的 API,它支持最常见的开箱即用协议。更重要的是,WCF 内置了序列化/反序列化。

    如果您不想使用 WCF,则可以使用 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 );
    }
    

    这是关于binary serialization的整篇文章。

    -帕维尔

    【讨论】:

    • 谢谢分配 :-) 好吧,我对这一切都很陌生,我不在乎用什么方法来实现和学习我需要的所有我需要的是一个服务/客户端解决方案,它可以帮助我发送值/对象到服务器并从服务器获取结果/答案,例如发送命令(字符串)“getProcesses”,服务器将发送回数组或对象(Process[] processlist = Process.GetProcesses();)回客户端很难吗?最好的方法是什么?
    • 通常您不会自己序列化/反序列化对象 - WCF 会为您完成。
    • 您回答中的 WCF 链接只会将您带到 .NET 简介页面。我意识到这已经快 8 年了,但我是一个 n00b,试图弄清楚如何在 C3 中通过网络发送数据,而这个问答在 DDG 搜索结果中出现的频率很高。
    • @YetAnotherRandomUser 修复了它
    【解决方案2】:

    您可以使用JavaScriptSerializer. 将您的对象序列化为json。它非常轻量级,并且易于使用。 只是不要忘记添加对 System.Web.Extensions.dll 的引用

    例如:

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

    在另一个类中

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

    【讨论】:

    • 当问题是关于 C# 时,你为什么推荐 JavaScript?
    • @YetAnotherRandomUser JSON 通常用作通过 HTTP 传输的任何内容的序列化格式,无论客户端和/或服务器用于解释数据的语言如何 - 它与 C# 的相关性不亚于 XML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多