Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
3-1086695303
white
2004-06-08 15:48
2004.07.04
Посоветуйте какой компонент подойдёт...


14-1087110425
Думкин
2004-06-13 11:07
2004.07.04
С днем рождения! 13 июня


3-1086338589
evgen
2004-06-04 12:43
2004.07.04
Где в БД хранятся картинки?


14-1087198264
Gero
2004-06-14 11:31
2004.07.04
О программистах(навеяно вопросом о любимой музыке программистов)


6-1084010482
slgeo
2004-05-08 14:01
2004.07.04
ServerSocket не обрабатывает данные от 2 клиентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский