2011-01-27 4 views
1

Я пытаюсь построить чат! теперь моя цель - получить вход от пользователя (который будет передан функции в классе), сохранить его и отправить объект пользователю через сеть.Как вы отправляете сериализованный объект по сети?

вот мой код до сих пор:

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

я все сохранены в BinaryFormatter, как я отправить его пользователю получить?

код клиента сторона:

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

ответ

1

В методе ProcessClient:

TcpClient client = (TcpClient) connection; 

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

я изменил мой код немного. я полагаюсь на клиентскую сторону для хранения сериализованного объекта и передачи его на сервер, а затем сервер должен передать его клиенту. –

+0

Вот как: типы клиентов. это относится к объекту, объект сериализуется -----------> переходит на сервер (сервер передает сериализованный объект каждому пользователю, который входит в систему) -----> клиент десериализует объект и читает, что на нем ... Вот код стороны клиента .... –

0

Вы можете использовать SOAP Архитектуры (использование XML-сериализации не Bynary сериализации) было бы гораздо easyer реализовать. Или, если вам нужен одноранговый чат code here.

+0

Я думаю, что если вы работаете только с объектами .net, рекомендуется использовать BinaryFormatter - если вам нужна поддержка multipattform - используйте SOAP или XML-сериализацию –

2

Рассмотрите WCF.

Он обрабатывает все проблемы связи, включая безопасность, различные протоколы и т. Д. С постоянной точки зрения высокого уровня.

Это в значительной степени стандарт для общения в сети .Net и охватывает и заменяет более старые более низкоуровневые технологии.

хороший учебник о том, как создать службу чата с использованием WCF см WCF/WPF Chat Application

Смежные вопросы