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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.07.2015, 10:15
mw_Kronos mw_Kronos вне форума
Прохожий
 
Регистрация: 12.01.2014
Сообщения: 12
Версия Delphi: RadStudio XE5
Репутация: 10
По умолчанию Как правильно работать с TTCPServer и TTCPClient?

Вот код простейшего сервера:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Web.Win.Sockets;

type
  TForm1 = class(TForm)
    TcpServer1: TTcpServer;
    procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var Buf:array of byte;
    BufSize:integer;
begin
  while ClientSocket.ReceiveBuf(buf) > 0 do
    begin
      //code...
    end;
end;

end.

Исследовал немного поведение TTCPServer.
1. При первом подключении (событие OnAccepr), создается от 1 до 3 потоков в DDServer.ServerSocketThread.ThreadPool.
2. Следующие подключения используют созданные потоки до тех пор, пока количество потоков не станет меньше, чем кол-во подключений. Как только очередному подключению не хватило потоков, кол-во потоков увеличивается на n(в моих тестах n менялось от 2-ух до 3-ех). Пример: при первом подключении создалось 3 потока. 2 и 3 подключение будут использовать 2 и 3 поток. 4-ое подключение спровоцирует увеличение кол-ва потоков с 3 до 3+n.
3. Потоки создаются автоматически. Создавать их вручную в обработчике OnGetThread не обязательно.
4. Поток не уничтожается после разрыва подключения. Освободившийся поток используется новыми подключениями.
5. ClientSocket.ReceiveBuf возвращает число меньше нуля, если подключение разорвано. В противном случае ClientSocket.ReceiveBuf ожидает получения данных. Таким образом код
Код:
  while ClientSocket.ReceiveBuf(buf) > 0 do
    begin
      //code...
    end;
будет выполнятся до тех пор, пока клиент не отключится.
6. Вызов методов TCPServer.Close и TCPServer.Destroy не влечет за собой уничтожение клиентских потоков. Они продолжают работать, если клиент не отключился. Если подключение разорвано, поток лишь останавливается (ClientSocketThread.Finished = True), но не уничтожается.
7. TCPClient никак не реагирует на полное отключение сервера(TCPServer1.Destroy + Application.Terminate + ручное уничтожение потоков в цикле TClientSocketThread(TCPServer1.ServerSocketThread. ThreadPool[i]).Free), и продолжает слать данные в пустоту.

Теперь вопросы:
1. Будет ли сервер на основе вышеприведенного кода работать корректно (при условии ручного уничтожения потоков после остановки сервера)?
2. Зачем во многих примерах в обработчике OnGetThread потоки создаются вручную?
3. Как правильно отследить отключение сервера на стороне клиента, не передавая никаких данных от сервера клиенту?
Ответить с цитированием
  #2  
Старый 17.07.2015, 12:25
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Чего? Нафига ерундой занимаешься, в сервере единственное событие надо обрабатывать, OnExecute, в нем и происходит обмен данными.
Дельфи какая?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 17.07.2015, 13:29
mw_Kronos mw_Kronos вне форума
Прохожий
 
Регистрация: 12.01.2014
Сообщения: 12
Версия Delphi: RadStudio XE5
Репутация: 10
По умолчанию

RadStudio XE5. Во всех примерах работы с TTCPServer, которые нашел, обмен данными происходит именно в OnAccept.

Последний раз редактировалось mw_Kronos, 17.07.2015 в 13:39.
Ответить с цитированием
  #4  
Старый 17.07.2015, 14:36
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Плохие примеры значит.

[УДАЛЕНО]
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 17.07.2015 в 15:24.
Ответить с цитированием
  #5  
Старый 17.07.2015, 15:22
mw_Kronos mw_Kronos вне форума
Прохожий
 
Регистрация: 12.01.2014
Сообщения: 12
Версия Delphi: RadStudio XE5
Репутация: 10
По умолчанию

Хм... Чем этот вариант лучше?
Ответить с цитированием
  #6  
Старый 17.07.2015, 15:24
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ничем, забудь.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter