Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пример передачи файла через Socket в режиме stThreadBlocking... [D5, Win2k, WinXP]


Страницы:   1 2

TankMan ©   (2005-04-01 08:07:00) 

Немогу разобраться, может кто-нибудь поделиться примером, работающим примером?


TankMan   (2005-04-11 12:07:00) [21]

>>Slym
Хм...Ошибки вроде не выдает, но и сервер не принимает :(

>>Slym
Не мог бы сказать, где может быть ошибка логическая на стороне сервера?


Slym   (2005-04-11 07:19:00) [22]


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 06:37:00) [23]

О клиенте:
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;

А выдает ошибку он мгновенно, т.е. файл фактически и не пересылается вообще :(


Digitman   (2005-04-08 09:16:00) [24]

Stream write error в дан.случае может возникать только при превышении таймайта, заданного 2-м параметром конструктора TWinSocketStream .. у тебя он равен ~ 20 сек .. т.е. за эти 20 сек гнездо клиента не подтвердило передачу всех данных, которые ассоциированы с FileStream


Digitman   (2005-04-08 08:27:00) [25]

где и как создается, инициализируется и активируется csClient ?


TankMan   (2005-04-08 06:37:00) [26]

А на стороне клиента - то что я уже писал :

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;

...чего-то не хватает? Отдельный поток не стал создавать, потому как приложение клиент ничем кроме как посылкой этого файла и не должно заниматься...
.. Может у меня не правильная политика?


TankMan   (2005-04-08 06:32:00) [27]

ОК.
Пример Серверной стороны показал 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.


Digitman   (2005-04-07 12:48:00) [28]


> TankMan ©   (07.04.05 12:32) [6]


приводи полный код ..


TankMan   (2005-04-07 12:32:00) [29]

Так и есть в этом режиме csClient у меня и работает...


Digitman   (2005-04-07 08:52:00) [30]


> серверу с режимом stThreadBlocking


для передатчика нет совершенно никакой разницы, в каком режиме работает гнездо приемника - в блокирующем или неблокирующем...

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


TankMan   (2005-04-07 07:31:00) [31]

Конкретно, был бы благодарен за пример пересылки файла со стороны 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-06 08:22:00) [32]

И какая же проблема ?


TankMan   (2005-04-06 06:52:00) [33]

Да, похоже кипятим...
У меня проблема, кажется, осталась с пересылкой из ClientSocket а не с принятием ServerSocket-ом...


Digitman   (2005-04-01 15:03:00) [34]

"Вы все еще кипятите ?" (с)

пример у тебя всегда есть - вполне работоспособный проект Borland Socket Server (scktsrvr.dpr), поставляемый с исх.текстами в Делфи ... там TSocketServer как раз используется в упомянутом режиме


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо