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

Вниз

ServerSocket не обрабатывает данные от 2 клиентов   Найти похожие ветки 

 
slgeo ©   (2004-05-08 14:01) [0]

Уважаемые мастера! Возникла такая проблема (возможно не совсем связанная с сокетами):
Использую TServerSocket в режиме stThreadBlocking.
Так вот, если серверная часть передает клиенту данные
ClientSocket.SendStream(TMyFileStream.Create(strFile, fmOpenRead or fmShareDenyWrite))
и в этот момент подключается другой клиент, то для первого клиента передача обрывается, а второй клиент подвисает на подключении к базе данных. Для наглядности приведу кусок кода:

procedure TDbServerThread.ClientExecute;
var
 Stream: TWinSocketStream;
 ...
begin
 LogMsg := DateTimeToStr(Now)+"Создаем поток... ";
 Synchronize(UpdateLog);
 Stream := TWinSocketStream.Create(ClientSocket, 30000);
 IBDatabase := TIBDatabase.Create(nil);
 IBDatabase.DatabaseName := Form1.dbName;
 IBDatabase.LoginPrompt := False;
 IBDatabase.Params.Add("user_name=sysdba");
 IBDatabase.Params.Add("password=masterkey");
 IBDatabase.Params.Add("LC_CTYPE=WIN1251");
 IBDatabase.TraceFlags := [tfConnect,tfError,tfQExecute,tfTransact];
 LogMsg := DateTimeToStr(Now)+"Соединяемся с БД... ";
 Synchronize(UpdateLog);
 IBDatabase.Connected := True; //здесь подвисаем
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LogMsg := DateTimeToStr(Now)+"Подключились к БД";
 Synchronize(UpdateLog);
 IBTransaction := TIBTransaction.Create(nil);
 IBTransaction.DefaultDatabase := IBDatabase;
 try
   while not Terminated and ClientSocket.Connected do
   begin
     // initialize (thread might be reused)
     if Stream.WaitForData(30000) then
     begin
       Buffer := "";
       strIn := "";
       SetLength(Buffer, 18);
       LogMsg := DateTimeToStr(Now)+" ********************** Клиент " + ClientSocket.RemoteAddress +" (" +ClientSocket.RemoteHost+")" +"******************************";
       Synchronize(UpdateLog);
//        Form1.AddToLog(DateTimeToStr(Now)+" ********************** Клиент " + ClientSocket.RemoteAddress +" (" + ClientSocket.RemoteHost+")" +"******************************");
       nRead := Stream.Read(Buffer[1], 18);
       if nRead = 0 then
       begin
         ClientSocket.Close;
         Break;
       end;
     SetLength (Buffer, nRead);
     StrIn := StrIn + Buffer;
     LogMsg := DateTimeToStr(Now)+" Клиент: " + ClientSocket.RemoteAddress + ": " + strIn;
     Synchronize(UpdateLog);
     end;
   ...
   ...
end;


 
Rouse_ ©   (2004-05-08 14:44) [1]

> fmShareDenyWrite
Ни о чем не говорит?


 
slgeo ©   (2004-05-08 14:51) [2]

Ни о чем.
А как связан запрет доступа к передаваемому файлу с подключением к БД?


 
Verg ©   (2004-05-08 15:28) [3]


> Так вот, если серверная часть передает клиенту данные
> ClientSocket.SendStream(TMyFileStream.Create(strFile, fmOpenRead
> or fmShareDenyWrite))


Где? В приведенном коде этого нет.


> IBDatabase


Где описана эта переменная?


 
slgeo ©   (2004-05-08 15:45) [4]

Извиняюсь, немного неточно расписал ситуацию:
Правильнее так, при первом же подключении второго клиента любые обращения к БД не проходят, т.е. для второго клиента зависает метод Database.Open (или Connected := True), а первый клиент уже не может в дальнейшем обращаться к БД (выполнять запросы), несмотря на то,что у него собственное соединение, транзакция, поток. Но ведь, если подключен один клиент, то весь обмен проходит без проблем.

>Verg
Переменные IBDatabase,IBTransaction объявлены в разделе var метода TDbServerThread.ClientExecute


 
slgeo ©   (2004-05-08 15:49) [5]

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


 
Digitman ©   (2004-05-09 12:30) [6]

try
 IBDatabase.Connected := True;
except
on e:exception do
  messagebox(0, PChar(e.classname + " " e.message), "", mb_ok);  
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
6-1084278741
malamba
2004-05-11 16:32
2004.07.04
выполнить команду на удаленной машине


1-1087405140
Хазей
2004-06-16 20:59
2004.07.04
Запись числа в файл


1-1087549721
Lm
2004-06-18 13:08
2004.07.04
ShellListView Һфон


1-1087382557
Cuper
2004-06-16 14:42
2004.07.04
Вопрос по Borland Pascal 7 (работа с записями)


1-1087760017
Arm79
2004-06-20 23:33
2004.07.04
mdi forms