Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.29;
Скачать: CL | DM;

Вниз

Нужна помощь   Найти похожие ветки 

 
просто_ник ©   (2007-06-28 23:47) [0]

TServerSocket -> stThreadBlocking -> как в етом случае отправить TFileStream, или бесполезно


 
SlymRO ©   (2007-06-29 04:29) [1]

Я бы сказал даже полезно...
Ты попробуй, оно не кувалдой махать...


 
просто_ник ©   (2007-06-29 11:35) [2]

режим сервера блокирующий
кувалда и Socket.SendStream(f) не проходит
играться с буфером немножко не в тему


 
medved_68 ©   (2007-06-29 11:36) [3]


> как в етом случае отправить TFileStream

Так же как и в любом другом.


 
Сергей М. ©   (2007-06-29 11:42) [4]


> просто_ник ©   (29.06.07 11:35) [2]


> режим сервера блокирующий


И что ?


> Socket.SendStream(f) не проходит


Не выдумывай.
Оч даже замечательно проходит.


> играться с буфером немножко не в тему


А причем здесь буфер ?


 
просто_ник ©   (2007-06-29 11:55) [5]

клиент не получает никакого события OnRead и никаких данных
в случае fSocketStream.WriteBuffer(buf,Length(buf)); или SendText все нормально, мистика


 
Сергей М. ©   (2007-06-29 12:01) [6]


> просто_ник ©   (29.06.07 11:55) [5]


Показывай, как у тебя реализован ClientExecute


 
просто_ник ©   (2007-06-29 12:05) [7]

в смысле ClientExecute, там я просто использую OnRead


 
Сергей М. ©   (2007-06-29 12:10) [8]

Тогда показывай обработчик OnRead


 
просто_ник ©   (2007-06-29 12:21) [9]

а если fSocketStream.CopyFrom(f,f.Size), вроде бы работает, только-что проверил принял 3 мг


 
Сергей М. ©   (2007-06-29 12:26) [10]

SendStream тоже обязан работать.

Другой вопрос что вызов тобой в OnRead/OnWrite любого из методов передачи лишает тебя всех преимуществ ThreadBloking-режима.


 
просто_ник ©   (2007-06-29 12:28) [11]

клиенту ж в принцыпе без разницы в каком режиме работает сервер, преимущества нужны для сервера, клиенты много передавать не будут


 
просто_ник ©   (2007-06-29 12:37) [12]

а с OnRead думаю все в порядке

procedure TForm18.dreamClientSocketRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 command:integer;
 temp:string;
begin

if SizeStream=0 then begin
 command:=StrToInt(Copy(temp,0,4));
 case command of
 7044:begin
   activCopy:=true;
   GlobalCommand:=command;
   command:=0;
   Delete(temp,1,4);
   temp2:=copy(temp,0,Pos("*",temp)-1);
   Delete(temp,1,Pos("*",temp));
   sizeStream:=StrToInt(temp2);

   GlobalFileStream:=TFileStream.Create(globalFileName,fmCreate);
   GlobalFileStream.Position:=0;
   GlobalFileStream.Write(temp[1],Length(temp));

   GlobalDisconnect.fileNameSave:=globalFileName;
   GlobalDisconnect.login:=Edit1.Text;
   GlobalDisconnect.Size:=sizeStream;
   GlobalDisconnect.SizeDisconnect:=GlobalFileStream.Size;
   speed:=speed+GlobalDisconnect.SizeDisconnect;
     if GlobalFileStream.Size=sizeStream then begin
     command:=GlobalCommand;
     sizeStream:=0;
     GlobalCommand:=0;
     GlobalDisconnect.open:=false;
     end;
 end;
 0999:;
 end;
 end else begin
 case GlobalCommand of
   7044:begin
   GlobalDisconnect.open:=true;
   GlobalFileStream.Position:=GlobalFileStream.Size;
   GlobalFileStream.Write(temp[1],Length(temp));

   progressBar(@bm1);

     if GlobalFileStream.Size=sizeStream then begin
     command:=GlobalCommand;
     GlobalCommand:=0;
     sizeStream:=0;
     end;
   end;
 end;
 0999:;  
 end;
 end;

 case command of
 7044:begin
 activCopy:=false;
 GlobalFileStream.Free;
 end;
 0999:;
 end;

end;


 
Сергей М. ©   (2007-06-29 12:45) [13]


> клиенту ж в принцыпе без разницы в каком режиме работает
> сервер


Совершенно верно.


> преимущества нужны для сервера


Вот как раз их ты и лишаешься, потому что обработка OnRead выполняется в основном треде.


> с OnRead думаю все в порядке


Далеко не все в порядке !

Это что, полный текст обработчика ?

И где в нем собственно тот самый SendStream ?


 
просто_ник ©   (2007-06-29 12:51) [14]

обработка OnRead выполняется клиентом, который даже не подозревает в каком режиме работает сервер, а сервер соотвественно не подозревает в каком режиме работает клиент или даже какая там ОС


 
просто_ник ©   (2007-06-29 12:53) [15]

обработчик вырван из кода поетому некоторые выщи например temp:=Socket.ReceiveText, я случайно пропустил, извиняюсь


 
Сергей М. ©   (2007-06-29 12:55) [16]

Так-с.

Ты вообще о чем  - о сервере ?

Судя по TServerSocket -> stThreadBlocking - именно о нем.

Так какого же ляда ты приплел сюда клиента и приводишь код клиента, а не сервера ?


 
просто_ник ©   (2007-06-29 13:02) [17]

проблема была в том что бы отправить файловый поток сервером в режиме stThreadBlocking клиенту и не терять преимущества stThreadBlocking, как клиент будет их принимать или не будет вообще без разницы.
SendStream в етом случае отпадает, с кодом на сервере думаю все нормально, я хотел услышать что-то наподобие fSocketStream.CopyFrom(f,f.Size) - что пришло мне методом научного тыка


 
Сергей М. ©   (2007-06-29 13:05) [18]


> проблема была в том что бы отправить файловый поток сервером
> в режиме stThreadBlocking


Ну так если она тебя еще волнует, прводи сюда свой код ClientExecute !

Я ж тебе еще в [6] это сказал, а тебя почему-то понесло на кл.сторону)


 
просто_ник ©   (2007-06-29 13:10) [19]

так проблема уже ж решена  
fSocketStream.CopyFrom(f,f.Size)

самое основное

type
 EServerThread = class( Exception );
 TServerThread = class( TServerClientThread )
   private
     fSocketStream : TWinSocketStream;
   public
     procedure ClientExecute; override;
 end;

implementation

uses Unit1;

procedure TServerThread.ClientExecute;
 f:TFileStream;
begin
 inherited FreeOnTerminate := TRUE;

 fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);
 f:=TFileStream.Create("2.ddd",fmOpenRead);
 fSocketStream.CopyFrom(f,f.Size)

 ClientSocket.Close;
 fSocketStream.Free;

end;


 
просто_ник ©   (2007-06-29 13:13) [20]

и еще
 while (not Terminated) and(ClientSocket.Connected) do begin
 if (not Terminated) and
  (not fSocketStream.WaitForData(1000)) then  else...

обработка ошибок и прочее, да все тут нормально


 
Сергей М. ©   (2007-06-29 13:24) [21]


> проблема уже ж решена


Ну решена знач решена. Дело хозяйское. Только вот и не было никакой проблемы, а была лишь твоя ошибка в 17-й строке.


> inherited FreeOnTerminate := TRUE;


Зачем FreeOnTerminate ? Да еще и inherited ?


 
просто_ник ©   (2007-06-29 13:38) [22]

я вырывая код кусками (большой очень), кстати
ClientSocket.Close; fSocketStream.Free; в обработчике ошибок
а FreeOnTerminate на случае неактивности сокета

fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);


 
Сергей М. ©   (2007-06-29 13:43) [23]


> а FreeOnTerminate на случае неактивности сокета


Эт чего, прямо так в справке и написано - самоликвидироваться в таком-то случае ?

Отсебячина, барин, отсебячина)


> fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);


Мог бы и не повторяться, я не слепой)


 
просто_ник ©   (2007-06-29 13:49) [24]

а я слышал где-то (не в справке) что там что - то  не разрушается до конца


 
Сергей М. ©   (2007-06-29 13:53) [25]


> слышал где-то


Я даже знаю где - в ресурсах ОБС.


 
просто_ник ©   (2007-06-29 13:54) [26]

ладно, проехали, и конечно спасибо за активность я не ожидал таковую


 
Сергей М. ©   (2007-06-29 13:56) [27]

Ну прлоехали знач проехали.
Жаль вот только, что ты так и не разобрался в сабже, предпочтя объехать его через Китай)


 
SlymRO ©   (2007-07-02 08:37) [28]

while (not Terminated) and(ClientSocket.Connected) do begin
if (not Terminated) and
 (not fSocketStream.WaitForData(1000)) then  else...

НЕЛЬЗЯ ТАК!
просто_ник ©   (29.06.07 13:49) [24]
что там что - то  не разрушается до конца

Так и есть... Кэш в 10 потоков (по деволту)...
Terminated может и ненаступить! твой флаг ClientSocket.Connected и только!
и никаких FreeOnTerminate... сервер сам разберется что и когда ему Free



Страницы: 1 вся ветка

Текущий архив: 2007.07.29;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
15-1182861256
de.
2007-06-26 16:34
2007.07.29
О Delphimaster


15-1183108237
Skyle
2007-06-29 13:10
2007.07.29
DataSnap(Midas) и Turbo Delphi for Win32 Pro. Возможно ли?


2-1183447174
delphino
2007-07-03 11:19
2007.07.29
Почему может долго грузится программа?


2-1183552580
Bad_B
2007-07-04 16:36
2007.07.29
Создать и уничтожить


1-1179903800
parasolka
2007-05-23 11:03
2007.07.29
Проиграть видео из Dll.