Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2012, 14:02   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Передача файлов по асинхронному сокету

Вообщем дело обстоит так, передаю файл по асинхронному сокету, но не совсем уверен если это является правильным стилем передачи. Пожалуйста, оцените и подскажите как сделать это лучше. По кусочкам или так как делаю я не совсем страшно.

Пакет
Код:
namespace AwarsUpdater.Classes
{
 [Serializable]
 public class _tagCONNECT
 {
  public int ProtocolType;
  public string Version;
  public string NewClient;
  public string FileName;
  public int FileSize;
  public byte[] FileBuffer;

  public byte[] XmlSerializerToArray(_tagCONNECT _tagConnect)
  {
   string XmlPath = Environment.CurrentDirectory + "\\Updates.xml";  
   if (File.Exists(XmlPath)) File.Delete(XmlPath);

   using (FileStream fs = File.Create(XmlPath))
   {
    XmlSerializer xml = new XmlSerializer(typeof(_tagCONNECT));
    xml.Serialize(fs, _tagConnect);
    byte[] buffer = new byte[fs.Length];
    fs.Position = 0;
    fs.Read(buffer, 0, buffer.Length);
    fs.Close();
    return buffer;
   }
  }

  public _tagCONNECT XmlDeserializerToUserType(byte[] buffer)
  {
   string XmlPath = Environment.CurrentDirectory + "\\Updates.xml";

   using (FileStream fs = File.Create(XmlPath))
   {
    XmlSerializer xml = new XmlSerializer(typeof(_tagCONNECT));
    fs.Write(buffer, 0, buffer.Length);
    fs.Position = 0;
    return (_tagCONNECT)xml.Deserialize(fs);
   }
  }

  public _tagCONNECT() { }
 }
}
# Перед передачей класс сериализуется и в FileBuffer передаю целый файл. Файлы весят не более 100кб. Но сейчас возникла потребность передавать файл как минимум до 5-7мб. И мне кажется передавать такой огромный буффер не совсем корректно.

Клиент

Код:
 
private void Send(Socket socket, byte[] buffer)
{
  socket.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(AsyncSender), socket);
}

private void AsyncSender(IAsyncResult result)
{
 Socket socket = (Socket)result.AsyncState;

 try
 {
  socket.EndSend(result);
  SendDone.Set();
 }
 catch (Exception Ex)
 {
  MessageBox.Show(Ex.Message);
 }
}
# Здесь принимаю файл, как видно по коду десериализуется класс и я использую нужные мне данные.

Сервер

Код:
  public class PacketBuffer
  {
   public const int BufferSize = 2048 * 1024; 
   public byte[] buffer = new byte[BufferSize];
   public Socket socket;
  }
Код:
  public void Receive(Socket socket)
  {
   PacketBuffer packet = new PacketBuffer();
   packet.socket = socket;

   try
   {
    socket.BeginReceive(packet.buffer, 0, packet.buffer.Length, SocketFlags.None, new AsyncCallback(AsyncReceiver), packet);
   }
   catch (Exception Ex)
   {
    MessageBox.Show(Ex.Message);
   }
  }

  private void AsyncReceiver(IAsyncResult result)
  {
   try
   {
    PacketBuffer packet = (PacketBuffer)result.AsyncState;
    Socket socket = packet.socket;
    int bytesRead = socket.EndReceive(result);

    if (bytesRead > 0)
    {
     _tagCONNECT _tagConnect = new _tagCONNECT();
     _tagConnect = (_tagCONNECT)_tagConnect.XmlDeserializerToUserType(packet.buffer);
Вообщем как-то так, за ранее спасибо за хорошую критику и советы.
Я понимаю конечно что можно делать так же как я делал, увеличив буффер допустим до 10мб, но мне жалко столько ресурсов тратить, надо как-то их по рациональней использовать

Последний раз редактировалось coNsept; 12.10.2012 в 14:10.
coNsept вне форума Ответить с цитированием
Старый 12.10.2012, 14:43   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Не использовал ну кажется лучше было бы
Guy вне форума Ответить с цитированием
Старый 12.10.2012, 21:03   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Во многих статьях и комментариях на буржуйских и не только форумах говорили что с этим методом имеются какие-то проблемы.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача файлов Вадим2011 C# (си шарп) 0 09.04.2011 23:21
Передача файлов. dradysman Фриланс 7 09.03.2010 12:27
Отсылать сообщение по сокету всем кто в сети KoBRaAndrey Работа с сетью в Delphi 4 09.11.2009 13:11
Передача файлов wolff Работа с сетью в Delphi 3 03.03.2007 15:54