![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача файлов
Vendict © (2008-01-12 11:04:00)Поиск по сабжу отдаёт исходники для 6й Delphi. нужно примерчик для 7й.
где только не искал, всё 6я ..
Сергей М. (2008-01-13 18:52:00) [1]
> Base64 кодирование ?
Какое еще нафих "кодирование", если даже с транспортом у тебя полная непонятка ?
Ты научись сначала надежной доставке данных, а уж потом будешь эти данные кодировать
DVM (2008-01-13 14:31:00) [2]
> а какой пример стоит использовать ?
Тот который не от TNM....
> Base64 кодирование ? ведь должен же быть способ более проще.
> .
А причем тут вообще Base64 ?
Примеры Indy?, ICS посмотри.
Vendict (2008-01-12 22:45:00) [3]а какой пример стоит использовать ?
Base64 кодирование ? ведь должен же быть способ более проще..
Сергей М. (2008-01-12 17:17:00) [4]Пример хоть и популярный, но крайне неудачный.
В условиях глоб.сети надежно работать он попросту не будет.
> выдаёт "Asynchrous socket error 10061". в чём проблема ?
Клиент не смог подключиться к серверу - на интересующем клиента хосте/порту нет активного сервера.
Vendict (2008-01-12 17:11:00) [5]продолжаем...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Button1: TButton;
procedure Image1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
Reciving: boolean;
DataSize: integer;
Data: TMemoryStream;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Image1Click(Sender: TObject);
begin
// Это процедура для открытия сокета на ПРИЁМ (RECEIVING).
// Button1.Click is this procedure as well.
ClientSocket1.Active:= true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета.
ServerSocket1.Active:= true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Посылаем команду для начала передачи файла.
Socket.SendText('send');
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s, sl: string;
begin
s:= Socket.ReceiveText;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
Image2.Picture.Bitmap.LoadFromStream(Data);
Data.Free;
Reciving:= false;
Socket.Close;
end;
except
Data.Free;
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms: TMemoryStream;
begin
// Клиент получает команду на передачу файла.
if Socket.ReceiveText = 'send' then
begin
ms:= TMemoryStream.Create;
try
// Получаем данные на передачу.
Image1.Picture.Bitmap.SaveToStream(ms);
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
// Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
end;
end;
end;
end.
выдаёт "Asynchrous socket error 10061". в чём проблема ?
Сергей М. (2008-01-12 16:53:00) [6]
> TNMStrmServ TNMStrm TNMMsg
Использовать эти компоненты не рекомендуется вообще.
> TClientSocketT ServerSocket
А эти лежат в пакете ($DELPHI)\BIN\dclsockets.bpl
Просто установи этот пакет и компоненты появятся в палитре
Vendict (2008-01-12 16:45:00) [7]TNMStrmServ
TNMStrm
TNMMsg
TClientSocket
TServerSocket
Сергей М. (2008-01-12 16:37:00) [8]
> компоненты, которых в 7й не наблюдается.
Какие конкретно ?
Vendict (2008-01-12 14:32:00) [9]так те исходники используют компоненты, которых в 7й не наблюдается.
нужна реализация для 7й Delphi.
DVM (2008-01-12 14:21:00) [10]в чем вопрос?