Форум: "Сети";
Текущий архив: 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