![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket не обрабатывает данные от 2 клиентов [D6, Win2k]
slgeo © (2004-05-08 14:01:00)Уважаемые мастера! Возникла такая проблема (возможно не совсем связанная с сокетами):
Использую 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;
Digitman (2004-05-09 12:30:00) [1]try
IBDatabase.Connected := True;
except
on e:exceptiondo
messagebox(0, PChar(e.classname + ' ' e.message), '', mb_ok);
end;
slgeo (2004-05-08 15:49:00) [2]возможно вопрос задан не в той тематике, но есть подозрения что это больше связано как-то с сокетным потоком.
Поскольку параллельный запуск поиска по БД в отдельных Threads вполне нормально отрабатывает.
slgeo (2004-05-08 15:45:00) [3]Извиняюсь, немного неточно расписал ситуацию:
Правильнее так, при первом же подключении второго клиента любые обращения к БД не проходят, т.е. для второго клиента зависает метод Database.Open (или Connected := True), а первый клиент уже не может в дальнейшем обращаться к БД (выполнять запросы), несмотря на то,что у него собственное соединение, транзакция, поток. Но ведь, если подключен один клиент, то весь обмен проходит без проблем.
>Verg
Переменные IBDatabase,IBTransaction объявлены в разделе var метода TDbServerThread.ClientExecute
Verg (2004-05-08 15:28:00) [4]
> Так вот, если серверная часть передает клиенту данные
> ClientSocket.SendStream(TMyFileStream.Create(strFile, fmOpenRead
> or fmShareDenyWrite))
Где? В приведенном коде этого нет.
> IBDatabase
Где описана эта переменная?
slgeo (2004-05-08 14:51:00) [5]Ни о чем.
А как связан запрет доступа к передаваемому файлу с подключением к БД?
Rouse_ (2004-05-08 14:44:00) [6]> fmShareDenyWrite
Ни о чем не говорит?