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

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

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2017, 10:27   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка Server на Delphi WinSock 5000 Рублей

Нужен сервер по Tcp, что бы принимал и отправлял сообщение, способный потянуть около 1000 клиентов, с интенсивностью сообщений 1-3 секунды, каждый клиент должен быть в отдельном потоке, то есть в принципе нужен аналог IdTcpSetver.OnExecut, только что б работал стабильно

мой вариант, но работает со сбоями
Код:
type 
  ZResString = record 
    xText: String; 
    jpText: String; 
    incText: String; 
end; 
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
var 
  ReqStrem : TMemoryStream; 
  ReqData  : TIdBytes; 
  ReqString : String; 
  ResString: ZResString; 
begin// 
  if AContext.Connection.Connected then 
  begin 
    try 
      if AContext.Connection.IOHandler.InputBuffer.Size > 0 then 
      begin 
        ReqStrem := TMemoryStream.Create; 
        AContext.Connection.IOHandler.ReadStream(ReqStrem, 
          AContext.Connection.IOHandler.InputBuffer.Size, false); 
        ReqStrem.Position := 0; 
        ReadTIdBytesFromStream(ReqStrem, ReqData, ReqStrem.Size); 
        ReqStrem.Free; 
        ReqString := BytesToString(ReqData, IndyTextEncoding_UTF8); 
        ResString := RGetTCPRespons.TcpResCreate(ReqString); // моя функция с другого юнита 
        try 
          AContext.Connection.IOHandler.WriteBufferOpen; 
          AContext.Connection.IOHandler.Write(ResString.xTex t + #0); 
          AContext.Connection.IOHandler.WriteBufferFlush; 
          AContext.Connection.IOHandler.WriteBufferClear; 
          AContext.Connection.IOHandler.WriteBufferClose; 
        except 
        end; 
        try 
          if ResString.JPText <> '' then 
          begin 
            AContext.Connection.IOHandler.WriteBufferOpen; 
            AContext.Connection.IOHandler.Write(ResString.jpTe xt + #0); 
            AContext.Connection.IOHandler.WriteBufferFlush; 
            AContext.Connection.IOHandler.WriteBufferClear; 
            AContext.Connection.IOHandler.WriteBufferClose; 
          end; 
        except 
        end; 
        try 
          if ResString.incText <> '' then 
          begin 
            AContext.Connection.IOHandler.WriteBufferOpen; 
            AContext.Connection.IOHandler.Write(ResString.incT ext + #0); 
            AContext.Connection.IOHandler.WriteBufferFlush; 
            AContext.Connection.IOHandler.WriteBufferClear; 
            AContext.Connection.IOHandler.WriteBufferClose; 
          end; 
        except 
        end; 
      end; 
    finally 
      sleep(10); 
    end; 
  end; 
end;
VirusN13

Последний раз редактировалось ArtGrek; 22.05.2017 в 21:46.
ArtGrek вне форума Ответить с цитированием
Старый 22.05.2017, 10:37   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

еще нужна функция, которая будет вызываться потоком,
она возвращает результат запроса из базы данных,
но так как это для потоков, в функцие должны создаваться нужные компоненты, а потом уничтожаться,
функций будет много, мне нужен 1 правильно работающий образец
вот моя, но из-за частых обращений бывают сбои
Код:
class function RGetInfo.GetGroups(): String; 
var 
  iStrig: String; 
  FDConnection: TFDConnection; 
  FDQuery: TFDQuery; 
begin 
  FDConnection := TFDConnection.Create(Form1);  
  with FDConnection do 
  begin 
    Params.Add('Database=myDB'); 
    Params.Add('DriverID=MySQL'); 
    Params.Add('Password=123456'); 
    Params.Add('Server=localhost'); 
    Params.Add('User_Name=root'); 
    Params.Add('CharacterSet=utf8'); 
    Params.Add('ReadTimeout=100'); 
    Connected := True; 
  end; 
  FDQuery := TFDQuery.Create(Form1);  
  FDQuery.Connection := FDConnection; 
    try 
      FDQuery.SQL.Clear; 
      FDQuery.SQL.Add('SELECT `name` FROM `880102` WHERE `active` = "1"'); 
      FDQuery.Open; 
        while not FDQuery.Eof do 
        begin 
          iStrig := iStrig + '"' + FDQuery.FieldByName('name').AsString + '",'; 
          FDQuery.Next; 
        end; 
        Delete(iStrig, length(iStrig), 1); 
      FDQuery.Close; 
    except 
    end; 
  Result := iStrig; 
  FDQuery.Destroy; 
  FDConnection.Destroy;  
end;
VirusN13

Последний раз редактировалось ArtGrek; 22.05.2017 в 10:54.
ArtGrek вне форума Ответить с цитированием
Старый 22.05.2017, 10:46   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

GROUP_CONCAT в запросе не пробовал вместо цикла на клиенте?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.05.2017, 10:49   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
GROUP_CONCAT в запросе не пробовал вместо цикла на клиенте?
не понял, это вы про запрос SQL?

UPD
Спасибо теперь буду знать, хотя для задания не принципиально
VirusN13

Последний раз редактировалось ArtGrek; 22.05.2017 в 10:53.
ArtGrek вне форума Ответить с цитированием
Старый 22.05.2017, 12:42   #5
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

IdTcpServer должен тянуть 1000 клиентов и работать стабильно.
Главное что бы оперативки хватало на потоки.

Последний раз редактировалось Avazart; 22.05.2017 в 13:05.
Avazart вне форума Ответить с цитированием
Старый 22.05.2017, 21:37   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Сообщение от Avazart Посмотреть сообщение
IdTcpServer должен тянуть 1000 клиентов и работать стабильно.
Главное что бы оперативки хватало на потоки.
32 гига, сервер будет что надо
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winsock API HTTP Server Lardes Работа с сетью в Delphi 10 21.12.2013 12:30
Winsock Client Server fucil Работа с сетью в Delphi 10 06.09.2012 00:37
TCP server/client на winsock, двусторонняя связь REDZERG Работа с сетью в Delphi 2 14.02.2011 22:26
статья - Игра Fortress 2. Создание лучшего бота – призовой фонд 5000 рублей! Pblog Обсуждение статей 0 03.07.2010 02:20
Winsock Client & Server [Проблемы и решения] iGlass Работа с сетью в Delphi 0 23.04.2010 16:29