Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Вниз

передача bitmap Объекта с использованием сокетов   Найти похожие ветки 

 
Truntaev   (2003-11-22 19:01) [0]

Мастера, как передать с использованием сокетов объект типа Binmap
с одного компьютера в сети на другой. Вот этот код работает, если
и ClientSocket и ServerSocket находятся в одном приложении.

{отправка}
bitblt(bmp.Canvas.Handle, 0, 0, 100, 50,DC, 50, 0, SRCCOPY);
s:=TmemoryStream.Create;
bmp.SaveToStream(S);

// ClientSocket1.Socket.SendText("111111"); - это без вопросов
ClientSocket1.Socket.SendBuf(S,S.Size);

{ прием}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
Var Stro:String;
begin
s:=TmemoryStream.Create;
s.Position:=0;
// Socket.ReceiveBuf(S,Razmer);
Socket.ReceiveBuf(S,7654); //- 7654 Это конкретный размер потока
// Showmessage(Socket.ReceiveText) // - строку принимает
end;


 
real_dimedrol   (2003-11-23 15:18) [1]

Где-то здесь на сайте валялся готовый пример. Ссылку не помню. Вот текст.
Простой способ отправки файлов при помощи TClientSocket & TServerSocket

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.
Я пробовал - все работает прекрасно.


 
truntaev   (2003-11-24 18:43) [2]

Увы, real_dimedrol - чего-то в этом супе видимо не
хватает. Короче не работает у меня такой кусок.


 
Polevi   (2003-11-25 09:18) [3]

это не может нормально работать



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
1-93546
Сережа
2004-01-17 23:31
2004.01.29
Таймер


14-93657
Ivolg
2004-01-09 11:57
2004.01.29
Ешник


14-93662
Knight
2004-01-07 23:50
2004.01.29
Курс доллара ЦБ РФ на 6 января:


14-93692
anana][
2004-01-06 15:32
2004.01.29
Когда-то я спрашивал, как можно добавить юзера...


6-93615
SkyN
2003-11-24 11:17
2004.01.29
как по имени сетевого диска (например i: ) получить имя куда он с





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский