Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.02.2013, 14:31
Marchelo2012 Marchelo2012 вне форума
Прохожий
 
Регистрация: 13.02.2013
Сообщения: 4
Репутация: 10
По умолчанию ServerSocket в режиме ThreadBlocking

Добрый день, уважаемые программисты! Опишу вкратце решаемую задачу.
Необходим сервер приема данных (текстовые сообщения в 15-20 строк). Данные отправляют клиенты (устройства, которые

связываются с сервером по каналу GPRS). Всего их 2000-2500 шт., каждый отправляет сообщение 1 раз в 5 минут,

соответственно на сервер примерно 5-20 обращений в секунду. Принятое сообщение необходимо поместить в Memo. Вроде бы задача

в 3 строки, но корректно настроить работу сервера не удается. Пошел сначала простым и неправильным путём:
1. ServerSocket в режиме stNonBlocking
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      {От клиента получено сообщение - выводим его в Memo1}
      Memo2.Lines.Insert(0,'Message received from client');
      Memo1.Lines.Insert(0,'> '+Socket.ReceiveText);
      if RadioButton1.Checked then begin
      ServerSocket1.Socket.Connections[0].SendText('OK');
      ServerSocket1.Socket.Connections[0].Close;
      end;
    end;
В таком режиме при появлении события посылки сообщения от клиента, сообщение записывается в Memo. Но, естественно, новое

соединение появляется раньше, чем происходит запись принятого текста.
То есть все сообщения принимаются, но принимаются они "урезанными". Ах да, забыл написать, что клиенту после приема от него

сообщения надо отправить "OK", чтобы устройство знало, что пакет принят и можно отключаться.
2. Было принято решение использовать сервер (как вы уже догадались=)) в режиме stThreadBlocking. При небольшом количестве

клиентов все работает прекрасно (вообщем то как и первый вариант), но при количестве 2000-2500 клиентов сообщения в Memo

вообще пишутся пустыми, и только изредка там появляется 1-2 строки от клиента, но этого, само собой, не достаточно. Вот

код:
Код:
//описываем класс
type
    TServerThread = class(TServerClientThread)
    procedure ClientExecute; override;
  end;
//описываем процедуру, которая будет срабатывать при запуске "нити"
procedure TServerThread.ClientExecute;
var i:integer;
begin
    Form1.Memo1.Lines.Insert(0,'> '+ClientSocket.ReceiveText);
    ClientSocket.SendText('OK');
    ClientSocket.Close;
    Terminate;
end;
...
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      Memo2.Lines.Insert(0,'Get Thread');
      //создаем экземпляр класса с приоритетом реального времени
      SocketThread:=TServerThread.Create(true, ClientSocket);
      SocketThread.Priority:=tpTimeCritical;
      SocketThread.Resume;
    end;
Подскажите, как модернизировать код, чтобы сервер справлялся с поставленной задачей? В процедуре

TServerThread.ClientExecute нужно что-то дописать, чтобы сервер ждал полного сообщения от клиента, а уже потом отсылал ему

"OK" и закрывал соединение. Финальная строка в тексте, полученном от клиента, всегда начинается с "REND"...

p.s. не забываем, что клиенты работают по gprs, соединение соответственно не "самолёт"... Заранее спасибо!
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:26.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025