2010-04-20 37 views
5

Tôi đang làm việc trên một dự án máy chủ/khách hàng. Khách hàng sẽ yêu cầu máy chủ cung cấp thông tin và máy chủ sẽ gửi lại cho khách hàngC# gửi nhận đối tượng qua mạng?

Thông tin có thể là chuỗi, số, mảng, danh sách, danh sách hoặc bất kỳ đối tượng nào khác. Các giải pháp tôi tìm thấy cho đến nay là serialize các đối tượng (dữ liệu) và gửi nó sau đó de-serialize nó để xử lý.

Đây là mã máy chủ:

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

đây là mã khách hàng mà sẽ trả về một đối tượng

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; 

     } 

Tôi cần phải biết một serialize tốt/serialize và làm thế nào để tích hợp nó vào giải pháp trên.

Trả lời

10

Cập nhật (8 năm sau)

Có nhiều cách để gửi dữ liệu qua mạng. Nó thường liên quan đến một số hình thức serialization trên một đầu và deserialization trên khác. Mặc dù, câu trả lời ban đầu của tôi sẽ hoạt động, tôi nghĩ rằng gRPC sẽ là một giải pháp tốt hơn vì nó cho phép khách hàng và máy chủ được viết bằng các ngôn ngữ khác nhau. Hơn thế nữa, nó cung cấp khả năng streaming và rất nhiều các plugin cộng đồng (đối với các số liệu, truy tìm, khai thác gỗ, vv) Bất cứ khi nào có thể, cố gắng không để tái phát minh ra bánh xe ...


gốc trả lời

bạn đã xem xét sử dụng dịch vụ Windows Communication Foundation chưa? WCF cung cấp cho bạn API mở rộng hỗ trợ các giao thức phổ biến nhất ra khỏi hộp. Và WCF nhiều hơn đã được xây dựng trong tuần tự hóa/deserialization.

Nếu bạn không muốn sử dụng WCF thì bạn có thể sử dụng Binary Serialization.

Đây là một cách sử dụng mẫu của serialization nhị phân:

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

Dưới đây là toàn bộ bài viết về binary serialization.

-Pavel

+0

Cảm ơn allot :-) Tôi là người mới đối với tất cả điều này Tôi không quan tâm đến cách nào để đạt được và tìm hiểu những gì tôi cần tất cả những gì tôi cần là giải pháp phục vụ/khách hàng giúp tôi gửi giá trị/đối tượng với máy chủ và nhận kết quả/trả lời từ máy chủ như gửi lệnh (chuỗi) "getProcesses" và máy chủ sẽ gửi lại mảng hoặc đối tượng (Process [] processlist = Process.GetProcesses();) cho khách hàng là khó khăn? cách tốt nhất để làm điều đó là gì? –

+0

nhưng làm thế nào để sử dụng mã của bạn với mã của tôi? –

+1

Tôi khuyên bạn nên đọc một trong các hướng dẫn "Bắt đầu với WCF" có sẵn như: http://msdn.microsoft.com/en-us/library/ms734712(VS.100).aspx http://weblogs.asp.net/ralfw/archive/2007/04/14/a-truely-simple-example-to-get-started-with-wcf.aspx http://msdn.microsoft.com/en-us /library/ms730144.aspx –

2

Bạn có thể tuần tự hóa các đối tượng của mình thành json, sử dụng JavaScriptSerializer .. Nó rất nhẹ và dễ sử dụng. Chỉ cần đừng quên để thêm một tham chiếu đến System.Web.Extensions.dll

ví dụ:

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

và trong lớp khác

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

Tại sao bạn đề xuất JavaScript khi câu hỏi là về C#? – YetAnotherRandomUser

+0

@YetAnotherRandomNgười dùng JSON thường được sử dụng làm định dạng tuần tự cho bất kỳ thứ gì được truyền qua HTTP, bất kể ngôn ngữ mà máy khách và/hoặc máy chủ đang sử dụng để diễn giải dữ liệu - nó không ít liên quan đến C# hơn XML. –

Các vấn đề liên quan