Форум: "Сети";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c