Главная страница
    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.035 c
3-1086845505
Leech
2004-06-10 09:31
2004.07.04
Поиск в БД


3-1086783370
Лера
2004-06-09 16:16
2004.07.04
Direct Oracle Access


14-1087056449
Xtz
2004-06-12 20:07
2004.07.04
Настроить маршрутизацию в 2003 сервере


14-1087284421
DSKalugin
2004-06-15 11:27
2004.07.04
Распространение программ


3-1086538714
gfr
2004-06-06 20:18
2004.07.04
Как сделать Секундомер





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