Форум: "Сети";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизПример передачи файла через Socket в режиме stThreadBlocking... Найти похожие ветки
← →
TankMan © (2005-04-01 08:07) [0]Немогу разобраться, может кто-нибудь поделиться примером, работающим примером?
← →
Digitman © (2005-04-01 15:03) [1]"Вы все еще кипятите ?" (с)
пример у тебя всегда есть - вполне работоспособный проект Borland Socket Server (scktsrvr.dpr), поставляемый с исх.текстами в Делфи ... там TSocketServer как раз используется в упомянутом режиме
← →
TankMan © (2005-04-06 06:52) [2]Да, похоже кипятим...
У меня проблема, кажется, осталась с пересылкой из ClientSocket а не с принятием ServerSocket-ом...
← →
Digitman © (2005-04-06 08:22) [3]И какая же проблема ?
← →
TankMan © (2005-04-07 07:31) [4]Конкретно, был бы благодарен за пример пересылки файла со стороны ClientSocket-а серверу с режимом stThreadBlocking. В сети не могу найти, может не там смотрю? А читая все то что написано по F1, мне кажется я так пришел к том что у меня и было :
sFile:=TFileStream.Create(edit3.text,fmOpenReadWrite);
Sock:=TWinSocketStream.Create(csClient.Socket,20000);
i:=Sock.CopyFrom(sFile,0); <<=====Сдесь выдается ошибка Stream write error
if i=0 then showmessage("VOT!:(");
sock.Free;
← →
Digitman © (2005-04-07 08:52) [5]
> серверу с режимом stThreadBlocking
для передатчика нет совершенно никакой разницы, в каком режиме работает гнездо приемника - в блокирующем или неблокирующем...
использование TWinSocketStream требует чтобы гнездо передатчика было инициализировано для работы в блок.режиме
← →
TankMan © (2005-04-07 12:32) [6]Так и есть в этом режиме csClient у меня и работает...
← →
Digitman © (2005-04-07 12:48) [7]
> TankMan © (07.04.05 12:32) [6]
приводи полный код ..
← →
TankMan © (2005-04-08 06:32) [8]ОК.
Пример Серверной стороны показал Slym, так я и сделал:
procedure TForm1.ssServerGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TSocketThread.Create(false,ClientSocket);
end;
{Описание SocketThread}
unit SocketThread;
interface
uses Windows,ScktComp,Classes;
type
TSocketThread=class(TServerClientThread)
protected
procedure ClientExecute; override;
end;
var
src:TFileStream;
implementation
uses unit1,SysUtils;
{ TSocketThread }
procedure TSocketThread.ClientExecute;
var Stream:TWinSocketStream;
dos:boolean;
begin
dos:=true;
try
Stream:=TWinSocketStream.Create(ClientSocket, 60000);
try
while (not Terminated) and ClientSocket.Connected do
begin
if Stream.WaitForData(10000) then
begin
if FileExists(ExtractFilePath(ParamStr(0))+"vot.upd") then DeleteFile(ExtractFilePath(ParamStr(0))+"vot.upd");
if not assigned(src) then
src:=TFileStream.Create(ExtractFilePath(ParamStr(0))+"vot.upd",fmCreate);
src.Seek(0,soFromEnd);
src.CopyFrom(Stream,Stream.Size);
ClientSocket.Close
end else
ClientSocket.Close;
end;
finally
Stream.Free;
end;
except
end;
end;
end.
← →
TankMan © (2005-04-08 06:37) [9]А на стороне клиента - то что я уже писал :
procedure TForm1.Button2Click(Sender: TObject);
var sFile:TFileStream;
Sock:TWinSocketStream;
smFile:tMemoryStream;
i:integer;
begin
sFile:=TFileStream.Create(edit3.text,fmOpenReadWrite);
Sock:=TWinSocketStream.Create(csClient.Socket,20000);
i:=Sock.CopyFrom(sFile,0);
if i=0 then showmessage("VOT!:(");
sock.Free;
end;
...чего-то не хватает? Отдельный поток не стал создавать, потому как приложение клиент ничем кроме как посылкой этого файла и не должно заниматься...
.. Может у меня не правильная политика?
← →
Digitman © (2005-04-08 08:27) [10]где и как создается, инициализируется и активируется csClient ?
← →
Digitman © (2005-04-08 09:16) [11]Stream write error в дан.случае может возникать только при превышении таймайта, заданного 2-м параметром конструктора TWinSocketStream .. у тебя он равен ~ 20 сек .. т.е. за эти 20 сек гнездо клиента не подтвердило передачу всех данных, которые ассоциированы с FileStream
← →
TankMan © (2005-04-11 06:37) [12]О клиенте:
object csClient: TClientSocket
Active = False
ClientType = ctBlocking
OnConnect = csClientConnect
OnDisconnect = csClientDisconnect
OnError = csClientError
end
Соединяется при старте программы:
begin
csClient.Address:="127.0.0.1";
csClient.Port:=6184;
try
csClient.Open;
except
raise
end;
А выдает ошибку он мгновенно, т.е. файл фактически и не пересылается вообще :(
← →
Slym © (2005-04-11 07:19) [13]
procedure TForm1.Button2Click(Sender: TObject);
var
Client: TClientSocket;
sFile:TFileStream;
begin
Client:=TClientSocket.Create(nil);
try
Client.ClientType:=ctBlocking;
Client.Address:="127.0.0.1";
Client.Port:=6184;
sFile:=TFileStream.Create(edit3.text,fmOpenRead);
try
Client.Open;
Client.Socket.SendStream(sFile)
finally
sFile.Free;
end;
finally
Client.Free;
end;
end;
← →
TankMan © (2005-04-11 12:07) [14]>>Slym
Хм...Ошибки вроде не выдает, но и сервер не принимает :(
>>Slym
Не мог бы сказать, где может быть ошибка логическая на стороне сервера?
← →
Slym © (2005-04-11 12:49) [15]
unit SocketThread;
interface
uses Windows,ScktComp,Classes;
type
TSocketThread=class(TServerClientThread)
protected
procedure ClientExecute; override;
end;
var
src:TFileStream;
implementation
uses unit1,SysUtils;
{ TSocketThread }
procedure TSocketThread.ClientExecute;
var
Stream:TWinSocketStream;
Size:integer;
FileStream:TFileStream;
begin
Stream:=TWinSocketStream.Create(ClientSocket, 60000);
try
while (not Terminated) and ClientSocket.Connected do
begin
if Stream.WaitForData(10000) then
begin
Stream.ReadBuffer(Size,4);
if Size=0 then Abort;
FileStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))+"vot.upd",fmCreate);
try
FileStream.CopyFrom(Stream,Size);
finally
FileStream.Free;
end;
ClientSocket.Close
end else
ClientSocket.Close;
end;
finally
Stream.Free;
end;
end;
end.
Клиент
procedure TForm1.Button2Click(Sender: TObject);
var
Client: TClientSocket;
sFile:TFileStream;
begin
Client:=TClientSocket.Create(nil);
try
Client.ClientType:=ctBlocking;
Client.Address:="127.0.0.1";
Client.Port:=6184;
sFile:=TFileStream.Create(edit3.text,fmOpenRead);
try
Client.Open;
Client.Socket.SendBuf(sFile.Size,4);
Client.Socket.SendStream(sFile)
finally
sFile.Free;
end;
finally
Client.Free;
end;
end;
← →
TankMan © (2005-04-11 14:51) [16]>>Slym
Ну я уже в изнеможении!! Чтож такое твориться то!?
Не работает! Выдает ошибку на строке FileStream.CopyFrom(Stream,Size); AccessViolation...
Я подумал всетаки что это же 2 посылки в клиенте, может два и приняти должно быть т.е.:
if Stream.WaitForData(10000) then
begin
Stream.ReadBuffer(Size,4);
if Size=0 then Abort;
FileStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))+"vot.upd",fmCreate);
try
Переделал в что-то типа:
if Size=0 then begin
Stream.ReadBuffer(Size,4);
if Size=0 then Abort; end else
begin
FileStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))+"vot.upd",fmCreate);
try
....
Но выдаваться стала ошибка с acessviolation в Stream.WaitForData, и я сделал обратно как было,
И не понимаю, почему же он читая эти 4 байта не хочет читать поток далее? Посмотрел по справке, если TFileStream.Create не удался то сразуже генерируется исключительная ситуация, точно так же и с TWinSocketStream.Create, т.е. объекты были созданы, со стороны клиента тоже нет никаких нареканий, но тогда ПОЧЕМУ!?!? Подскажи? Я не могу понять...:(
← →
TankMan © (2005-04-11 14:53) [17]З.Ы.
Ах да забыл, sFile.Free; не нужен же вклиенте (написано в справке) или я ошибаюсь?
← →
Slym © (2005-04-12 11:43) [18]Free нужна всегда и везде!
А в остальном я ЗдаюсЪ... (у тебя код перед глазами ставь бряк поинты и трасируй, может синтаксически код и не правильный, я не проверял, но логически правильный уверен на 99%)
← →
Verg © (2005-04-12 12:22) [19]
Note: The Stream passed as a parameter to SendStream becomes “owned” by the windows socket object. The Windows socket object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.
← →
TankMan © (2005-04-13 07:02) [20]Может всетаки имеет какой-нибудь рабочий пример? - разберусь как-нибудь то уж :(...
← →
Verg © (2005-04-13 17:12) [21]
> TankMan © (13.04.05 07:02) [20]
Разбирайся, разбирайся. Sock.CopyFrom(sFile,0) все наипрекраснейшим образм делает. Ищи ошибки не только, где ты думашь, что они могут быть, а везде.
← →
TankMan © (2005-04-14 06:48) [22]Хм.. я отдельно сделал проэктики, чтобы реализовать таки возможность передачи файлов, а не получается, там код, что ты привел в пример, у тебя все работает, или ты не пробовал?
← →
Digitman © (2005-04-14 09:01) [23]
> TankMan © (14.04.05 06:48) [22]
слушай, ты про встроенный в делфи отладчик хоть что-нибудь слышал ?
или использование оного в целях поиска источников проблем - "не царское дело" ?
← →
Verg © (2005-04-14 18:24) [24]
> TankMan © (14.04.05 06:48) [22]
Все проверено досканально и не только мной, или ты думаешь ты первый, кто использует TWinSocketStream?
Помнится было однажды тут необъяснимое с этим объектом. Оказалось, что не собственно с ним, а с overlapped IO на сокетах. Даже тема вспоминается: "Что лучше recv или readfile..." или что-то типа того...
Переустановил винды чел - помогло.
← →
TankMan © (2005-04-15 08:24) [25]>>Digitman
Про встроенный отладчик я слышал, и даже видел, но не более того...,т.е. работать я с ним не умею :((к сожалению)
SoftIce мне знаком, а вот этот отладчик нет...
>>Verg
Т.е. ты говоришь, что у тебя приведенный код работает на 100%?
← →
Digitman © (2005-04-15 08:48) [26]
> TankMan © (15.04.05 08:24) [25]
> работать я с ним не умею
это очень печально.
не одну еще шишку набьешь себе, пытаясь приспособить чужой код по принципу "авось заработает"
← →
TankMan © (2005-04-19 07:59) [27]Не сочтите за грубость, но намой вопрос так и не кто не ответил...
← →
Ozone © (2005-04-19 11:32) [28]Дык и не ответят, ИмХО. Раз не умеешь пользоваться отладчиком - учись.
← →
Digitman © (2005-04-19 11:38) [29]
> TankMan © (19.04.05 07:59) [27]
понимаешь ли, в ЛЮБОМ случае тебе придется адаптировать тот или иной алгоритм (пусть он хоть тысячу раз работоспособен в том виде в каком ты его поимел) под свои потребности .. а без знания и эффект.использования встр.отладчика тебе этот алгоритм как мертвому припарка .. так что садись за буквари и срочно штудируй встроенные возможности среды по отладке/трассировке ОР-кода
← →
Dust © (2005-07-09 18:27) [30]Народ, есть программа, которая запросто компилируется и работает в Delphi 5, в ней использовались компоненты TClientSocket и TServerSocket, как её можно откомпилировать в Delphi 7,
чем можно заменить эти компонеты? как потом переделать исходный код?
← →
debuger © (2005-07-10 14:25) [31]что-то типа того: TTCPClient, TTCPServer?
← →
Ботвин Дмитрий (2005-07-11 08:36) [32]>Dust © (09.07.05 18:27) [30]
Так и в D7 есть TClientSocket и TServerSocket, просто их нужно
устновить. Устанавливай и работай....
← →
Nes © (2005-07-11 12:42) [33]http://www.sources.ru/delphi/delphi_send_files_tcs_tss.shtml
← →
Nes © (2005-07-11 12:45) [34]Arrr 2 Dust: Component->Install Packages->Add->Bin/dclsockets70.bpl
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.036 c