Главная страница
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.221 c
3-1108722587
Phoenix9000
2005-02-18 13:29
2005.03.27
Срочно. База данных Microsoft Access и программа для работы с ней


1-1110411855
Silla
2005-03-10 02:44
2005.03.27
MDI Application


4-1108468976
pasha_golub
2005-02-15 15:02
2005.03.27
Запуск процесса из ресурса


3-1109080112
denis24
2005-02-22 16:48
2005.03.27
Проблема с Fibplus 5.3.0


14-1109943182
mrAld
2005-03-04 16:33
2005.03.27
Регистрация Web-сервиса на IIS .net