Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.041 c
1-1128868680
AndrewLi
2005-10-09 18:38
2005.10.30
Соблюдение формата адреса электронной почты


3-1127348697
Дмитрий Белькевич
2005-09-22 04:24
2005.10.30
4th dimenstion


1-1128591758
Dimich1978
2005-10-06 13:42
2005.10.30
Управлять чужой менюшкой лежащей в трее


2-1128252504
Volf_555
2005-10-02 15:28
2005.10.30
Как в поле ввода пароля вводимый пароль отображать звёздочками?


14-1128918658
WondeRu
2005-10-10 08:30
2005.10.30
Опрос: А вы заглядываете под крышку колы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский