2010-04-20 3 views
5

Je travaille sur un projet serveur/client. Le client demandera au serveur des informations et le serveur les renverra au client.C# envoyer recevoir un objet sur le réseau?

Les informations peuvent être une chaîne, un nombre, un tableau, une liste, un arrailiste ou tout autre objet. La solution que j'ai trouvée jusqu'à présent est de sérialiser l'objet (données) et de l'envoyer puis de le dé-sérialiser pour le traiter.

Voici le code du serveur:

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

est le code client ici qui devrait renvoyer un objet

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; 

     } 

J'ai besoin de connaître un bon serialize/sérialisation et comment l'intégrer dans la solution ci-dessus.

Répondre

10

(8 ans plus tard)

Il existe plusieurs façons d'envoyer des données sur le réseau. Cela implique généralement une forme de sérialisation à une extrémité et une désérialisation de l'autre. Bien que ma réponse originale fonctionne, je pense que gRPC serait une meilleure solution car elle permet d'écrire le client et le serveur dans différentes langues. De plus, il offre des capacités de diffusion en continu et un grand nombre de plug-ins de la communauté (pour les mesures, le suivi, l'exploitation forestière, etc.) Autant que possible, essayez de ne pas réinventer la roue ...


Réponse originale

avez-vous envisagé d'utiliser les services Windows Communication Foundation? WCF vous offre une API extensible qui prend en charge les protocoles les plus courants prêts à l'emploi. Et de plus, WCF a intégré la sérialisation/désérialisation.

Si vous ne souhaitez pas utiliser WCF, vous pouvez utiliser Binary Serialization.

C'est un usage de l'échantillon de la sérialisation binaire:

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

est ici l'article complet sur les binary serialization.

-Pavel

+0

allouent bien que je suis nouveau à tout cela je me fous de ce chemin à parcourir pour atteindre et apprendre ce que je dois tout ce que je besoin est une solution servir/client qui me aider à envoyer des valeurs/objets au serveur et obtenir des résultats/réponses du serveur comme l'envoi d'une commande (chaîne) "getProcesses" et le serveur renverra un tableau ou un objet (Process [] processlist = Process.GetProcesses();) retour au client est-ce difficile? quelle est la meilleure façon de le faire? –

+0

mais comment utiliser votre code avec mon code? –

+1

Je vous recommande de lire l'un des tutoriels disponibles "Getting Started with WCF" comme: 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/fr-fr /library/ms730144.aspx –

2

Vous pouvez sérialiser vos objets dans json, en utilisant JavaScriptSerializer .. Il est très léger et facile à utiliser. Il suffit de ne pas oublier d'ajouter une référence à System.Web.Extensions.dll

par exemple:

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

et dans l'autre classe de mise à jour

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

Pourquoi recommandez-vous JavaScript lorsqu'il s'agit de la question C#? – YetAnotherRandomUser

+0

@YetAnotherRandomUser JSON est couramment utilisé comme format de sérialisation pour tout ce qui est transmis via HTTP, quel que soit le langage utilisé par le client et/ou le serveur pour interpréter les données - il n'est pas moins lié à C# qu'au XML.Merci :-) –

Questions connexes