Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.027 c
1-1110493444
WST
2005-03-11 01:24
2005.03.27
И снова CheckBox


14-1109958728
SOFS
2005-03-04 20:52
2005.03.27
Москва


1-1110384086
grusty
2005-03-09 19:01
2005.03.27
Как выполнить процедуру другого окна текущего приложения...


1-1110971671
aleshap
2005-03-16 14:14
2005.03.27
Event OnEnter


4-1108127856
Grief
2005-02-11 16:17
2005.03.27
AllocateHWND




   Наверх