Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

TServerSocket   Найти похожие ветки 

 
Наф   (2005-01-27 12:11) [0]

Создаю приложение с Server:TServerSocket
1. Делаю Server.ServerType:=stNonBlocking
2. Наследую класс TServerClientThread
TServerThread=class(TServerClientThread)
public
procedure ClientExecute; override;
end;

Для начала пишу в ClientExecute следующий код:
procedure TServerThread.ClientExecute;
begin
 while (not Terminated) and ClientSocket.Connected do
 begin
   //пока ничего
 end;
end;

3. В событии OnGetThread пишу:
procedure TDataModule2.ServerGetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;
 var SocketThread: TServerClientThread);
begin
SocketThread:=TServerThread.Create(true,ClientSocket);
SocketThread.FreeOnTerminate:=true;
SocketThread.Priority:=tpLower;
SocketThread.Resume;
end;

4. Запускаю сервер, Server.Open при создании формы
В диспечере задач появляется 2 потока, почему? один поток неявно создается неявно самим Server:TServerSocket?
5. Запускаю клиента. Появляется еще один поток (всего 3) - нормально по-моему. Отключаю клиента, поток не уходит. Почему?
Снова запускаю - всеравно 3 потока. Запускаю еще одного - теперь их 4. Отключаю обоих - попрежнему 4.
Если  код поменять на
procedure TServerThread.ClientExecute;
var
Stream:TWinSocketStream;
s:string;
begin
 Stream:=TWinSocketStream.Create(ClientSocket,10000);
 s:="*";
 while (not Terminated) and ClientSocket.Connected do
 begin
  Stream.Write(s,1);
 end;
end;

то клиент "забивается звездочками" - нормально, но если клиент отключается, то на сервере ошибка "Устройство не опознает команду". Как бороться?
Заранее спасибо.


 
Polevi ©   (2005-01-27 12:30) [1]

посмотри TServerClientThread::Execute


 
Digitman ©   (2005-01-27 13:02) [2]


> SocketThread.FreeOnTerminate:=true;


это убери.


> В диспечере задач появляется 2 потока, почему?


один - основной, другой - AcceptThread


 
Digitman ©   (2005-01-27 13:13) [3]

так, стоп ..

в режиме stNonBlocking событие OnGetThread НЕ возбуждается вообще.


 
Наф   (2005-01-27 13:45) [4]

Digitman: ошибка, конечно Server.ServerType:=stThreadBlocking


 
Digitman ©   (2005-01-27 14:15) [5]


> Наф   (27.01.05 13:45) [4]


тогда список трэдов процесса, который ты видишь, состоит из:

- основного трэда процесса: он ВСЕГДА создается и существует вплоть до завершения процесса

- трэда, созданного классом TServerAcceptThread : этот трэд создается при активации TServerSocket и занят только тем что "слушает" вх.запросы на соединение клиентов с сервером, при успешном акцепте создает новое гнездо и стартует (либо берет из кэша свободных) транспортный трэд для обслуживания вновь созданного тр.канала с клиентом

- транспортных трэдов : по одному на каждое соединение с отдельным клиентом


 
Smithson   (2005-01-27 14:33) [6]

Причем эти последние при отвале клиента не убиваються, а переводятся в режим ожидания. И только если новых коннектов нет продолжительное время, то они завершаются. По-моему, так.


 
Digitman ©   (2005-01-27 16:13) [7]


> Smithson   (27.01.05 14:33) [6]


> По-моему, так


нет, не так.



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
14-1109578732
Tornado
2005-02-28 11:18
2005.03.27
Не работает Windows Update


14-1110370933
saNat
2005-03-09 15:22
2005.03.27
Использование витой пары


14-1110053626
Vasya.ru
2005-03-05 23:13
2005.03.27
Помогите найти алгоритм


1-1110574689
Ji
2005-03-11 23:58
2005.03.27
Чтение двоичного файла.


3-1109214255
Анатолик
2005-02-24 06:04
2005.03.27
Подскажите уважаемые, делаю вуборкус помошью запроса из БД,