Главная страница
    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.46 MB
Время: 0.037 c
1-1087365006
Term
2004-06-16 09:50
2004.07.04
Кто работал с компонентами ZipTV, нужна помощь


8-1082402611
DimaK
2004-04-19 23:23
2004.07.04
Заливка


1-1087357108
Zipkin
2004-06-16 07:38
2004.07.04
Main+Menu


1-1087504411
Gear
2004-06-18 00:33
2004.07.04
Статическая линковка lib файлов


10-1017300695
AnatolyG
2002-03-28 10:31
2004.07.04
Вопрос по поводу использования персистентных CORBA и EJB объектов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский