Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.02.2009, 10:27
SergJ4 SergJ4 вне форума
Прохожий
 
Регистрация: 13.02.2009
Сообщения: 4
Репутация: 10
По умолчанию Indy 10. Обмен фаилами

Задача вроде проста. Клиент отправляет файл на сервер, тот его сохраняет у себя. Обмен командами проходит как надо. Поток у клиента нормально создается, все хокей. А вот на сервере файл не появляется и все тут Пытался юзать WriteFile у клиента. Та же история. Где я тут затупил, товарищи!?

Код клиента:
Код:
unit SDIMAIN;

interface

uses Windows, Classes, Graphics, Forms, Controls, Menus,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns,
  ActnList, ToolWin, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  sysutils;

type
  TSDIAppForm = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    IdTCPClient1: TIdTCPClient;
    Label1: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SDIAppForm: TSDIAppForm;

implementation



{$R *.dfm}


procedure TSDIAppForm.Button1Click(Sender: TObject);
var
f: file of byte;
fs,fn: string;
mem:TmemoryStream;
begin
IdTCPClient1.Host:=Edit1.Text;
AssignFile(f,Edit2.Text);
Reset(f);
fs:=inttostr(FileSize(f));
fn:=ExtractFileName(Edit2.Text);
CloseFile(f);
mem:=Tmemorystream.Create;                                
IdTCPClient1.Connect;
try
  IdTCPClient1.IOHandler.WriteLn('send_file');
  IdTCPClient1.IOHandler.WriteLn(fs);
  IdTCPClient1.IOHandler.WriteLn(fn);
  if IdTCPClient1.IOHandler.ReadLn()='ready' then begin     //ready создан просто для проверки.Доходит ли до данного этапа прога. Доходит.
   mem.LoadFromFile(Edit2.Text);
   Label1.Caption:='ready';
   IdTCPClient1.IOHandler.Write(mem);
   mem.SaveToFile('D:\221.bmp'); //опять же для проверки. Есть ли что-то в потоке. Есть.
   end;
  finally
IdTCPClient1.Disconnect;
end;
mem.Free;
end;

procedure TSDIAppForm.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then Edit2.Text:=OpenDialog1.FileName;
end;

end.

Код Сервера:
Код:
unit Сервер;

interface

uses Windows, Classes, Graphics, Forms, Controls, Menus,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns,
  ActnList, ToolWin, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdTCPServer, idcontext, sysutils;

type
  TSDIAppForm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    IdTCPServer1: TIdTCPServer;
    procedure FormCreate(Sender: TObject);
    procedure IdTCPServer1Execute(AContext: TIdContext);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SDIAppForm: TSDIAppForm;

implementation



{$R *.dfm}

procedure TSDIAppForm.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active:=true;
end;

procedure TSDIAppForm.IdTCPServer1Execute(AContext: TIdContext);
var
comm,fs,fn:string;
mem: TmemoryStream;
begin
mem:=Tmemorystream.Create;
try
comm:=AContext.Connection.IOHandler.ReadLn();
Label1.Caption:=comm;
fs:=AContext.Connection.IOHandler.ReadLn();
Label2.Caption:=fs;
fn:=AContext.Connection.IOHandler.ReadLn();
Label3.Caption:=fn;
AContext.Connection.IOHandler.WriteLn('ready');
AContext.Connection.IOHandler.ReadStream(mem);
mem.SaveToFile('D:\21.bmp');
finally
AContext.Connection.Disconnect;
end;
mem.Free;
end;

end.
Admin: Для оформления кода используем тег "Код", а не "Цитата".

Последний раз редактировалось SergJ4, 13.02.2009 в 14:41.
  #2  
Старый 14.02.2009, 05:53
SergJ4 SergJ4 вне форума
Прохожий
 
Регистрация: 13.02.2009
Сообщения: 4
Репутация: 10
По умолчанию

Разобрался вроде сам. Если кому понадобится сие дело, то добавил всего две строчки в клиент и изменил одну строчку сервера.
Для клиента:
Код:
IdTCPClient1.IOHandler.WriteBufferOpen;
   IdTCPClient1.IOHandler.Write(mem);
   IdTCPClient1.IOHandler.WriteBufferClose;
Для сервера (просто добавил параметра два):
Код:
AContext.Connection.IOHandler.ReadStream(mem,-1,true);
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:40.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025