Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
ВнизНужна помощь Найти похожие ветки
← →
просто_ник © (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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.042 c