2011-01-27 3 views
1

J'essaie de construire une conversation! maintenant mon but est de recevoir l'entrée de l'utilisateur, (qui sera alimentée à une fonction dans une classe), l'enregistrer et envoyer l'objet à l'utilisateur sur le net.Comment envoyer un objet sérialisé sur net?

ici est mon code à ce jour:

namespace ConsoleApplication1 
{ 
    class Program 
    {  
     static void Main(string[] args) 
     { 
      TcpListener server = new TcpListener(IPAddress.Any, 5000); 
      server.Start(); 
      Console.WriteLine("Server started"); 
      int a = 0; 

      while (true) 
      { 
       TcpClient connection = server.AcceptTcpClient(); 
       Console.WriteLine("connection accepted"); 

       ThreadPool.QueueUserWorkItem(ProssecClient, connection); 
      } 
     } 

     public static void ProssecClient(object o) 
     { 
      TcpClient connection = o as TcpClient; 
      if (connection == null) 
       return; 
      StreamReader sr = new StreamReader(connection.GetStream()); 
      StreamWriter sw = new StreamWriter(connection.GetStream()); 
      string word = ""; 
      savedObject saved = new savedObject(); 

      try 
      { 
       while (true) 
       { 
        sw.WriteLine(sr.ReadLine()); 
        sw.Flush(); 

        // here the server should read and retrieve, 
        // everything that it gets to every user that logs in. 
       } 
      } 
      catch 
      { 
       Console.WriteLine("client left"); 
      } 
     }   
    } 
} 

i ont tout enregistré dans BinaryFormatter, comment puis-je l'envoyer à l'utilisateur de recevoir?

code côté client:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Threading; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpClient connection = new TcpClient("127.0.0.1", 5000); 
      StreamReader sr = new StreamReader(connection.GetStream()); 
      StreamWriter sw = new StreamWriter(connection.GetStream()); 
      savedObject saved = new savedObject(); 
      Stream stream = File.Open("EmployeeInfo.osl", FileMode.Create); 
      BinaryFormatter bformatter = new BinaryFormatter(); 
      string word = ""; 
      string allwords = ""; 

      Thread Listen = new Thread(deserialise); 
      Listen.Start(); 

      while (true) 
      { 
       word = Console.ReadLine(); 
       allwords = saved.AllWords(word); 
       sw.WriteLine(allwords); 
       sw.Flush(); 
       Console.WriteLine(sr.ReadLine()); 

       //Serialize 
       //bformatter.Serialize(stream, saved); 
       //stream.Close(); 

       //sw.WriteLine(saved); 
      } 
     } 
    } 

    public static void deserialise() 
    { 
     //Deserialize 
     //if (File.Exists("EmployeeInfo.osl")) 
     //{ 
     // stream = File.Open("EmployeeInfo.osl", FileMode.Open); 
     // bformatter = new BinaryFormatter(); 

     // saved = (savedObject)bformatter.Deserialize(stream); 
     // stream.Close(); 
     //} 

    } 
} 

[Serializable()] 
class savedObject : ISerializable 
{ 
    public string allwords; 

    public string AllWords(string words) 
    { 
     allwords += words + " "; 
     return allwords; 
    } 

    public void Words(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("RetrievedWord", allwords); 
    } 


    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     allwords = (String)info.GetValue("RetrievedWord", typeof(string)); 
    } 
} 

Répondre

1

Dans la méthode ProcessClient:

TcpClient client = (TcpClient) connection; 

using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream())) 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    binaryFormatter.Serialize(streamWriter, savedObject); 
} 
+0

j'ai changé mon code un peu. Je compte sur le côté client pour contenir l'objet sérialisé et le transmettre au serveur, puis le serveur doit le renvoyer au client. –

+0

Voici comment: types de clients. cela va à un objet, l'objet est sérialisé -----------> va au serveur (le serveur passe l'objet sérialisé à chaque utilisateur qui se connecte) -----> le client désérialise le objet et lit ce qu'il y a dessus ... Voici le code côté client ... –

0

Vous pouvez utiliser un savon Arhitecture (utilisation sérialisation XML de sérialisation non Bynary) il serait beaucoup easyer à mettre en œuvre. Ou si vous avez besoin d'un chat peer to peer code here.

+0

Je pense que si vous travaillez uniquement avec des objets .net, il est recommandé d'utiliser BinaryFormatter - si vous avez besoin d'un support multiplateforme - utilisez la sérialisation SOAP ou XML –

2

Considérez WCF.

Il gère tous les problèmes de communication, y compris la sécurité, les différents protocoles, etc. à partir d'une perspective cohérente de haut niveau.

C'est à peu près la norme pour la communication dans .Net et englobe et remplace les anciennes technologies de plus bas niveau.

Pour un bon tutoriel de la façon de construire un service de chat en utilisant WCF voir WCF/WPF Chat Application

Questions connexes