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

Вниз

Сокеты   Найти похожие ветки 

 
TButton   (2003-09-05 20:50) [0]

Здрася. Требо используя сокеты передать имаджик (8ми битный). Чую что надо копать в сторону SendBuffer, но пока сомневаюсь, не уверен что именно в этом буфере засылать, не попиксельно же мне имаджик транслировать... хотя если сохранить имаджик в файле типа байт, потом считать... тогда получатель должен будет преобразовывать массив обратно в имадж, тады ему нужна еще и палитра, хотя палитру можно использовать фиксированую... вобщем хотелось бы услышать ответ людей более опытных чем я...


 
TButton   (2003-09-06 20:32) [1]

Никогда раньше не пользовался Stream"ами, поэтому не сразу обратил внимание на
1. TBitMap.SaveToStream;
2. TServerSocket.Socket.SendStream;
хотелось бы получить ответ, как используя п. 1 и 2 зробить пересылку имаджа через сокет.

поду по експерементирую...


 
TButton   (2003-09-06 21:05) [2]


procedure TForm1.SpeedButton1Click(Sender: TObject);
var
bmp:TBitMap;
str:TStream;
begin
str:=TStream.Create;
bmp:=TBitMap.Create;
bmp.LoadFromFile("image.bmp");
bmp.SaveToStream(str);
SpeedButton1.Caption:=IntToStr(SizeOf(bmp));
bmp.Free;
str.Free;
end;


а ведь предупреждали нас [Warning] Unit1.pas(32): Constructing instance of "TStream" containing abstract methods, так ведь нет! прем дальше, аот и напороли сь на Abstract Error. Чует мое сердце, что-то здесь не так...


 
TButton   (2003-09-06 21:19) [3]

немного подумав я дошел до следущего:

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
bmp:TBitMap;
str:TStream;
begin
str:=TWinSocketStream.Create(ServerSocket1.Socket,0);
bmp:=TBitMap.Create;
bmp.LoadFromFile("image.bmp");
bmp.SaveToStream(str);
SpeedButton1.Caption:=IntToStr(SizeOf(bmp));
bmp.Free;
str.Free;
end;

но и тут не все пошло гладко, выползла ерора "Socket must be in blocking mode" не найдя никакого моде в свойствах сокета, я решил что речь идет о ServerType и установил его в stThreadblocking. но не тут то было! ерора появлялась вновь и вновь. есть какие-нить мысли на эту тему?


 
WhiteShadow   (2003-09-07 17:53) [4]

Извини что прерываю твою милую беспеду :)
твою проблемы я бы решил путем использования SendBuffer. правда я юзАю D7 и Indy. но если хош скачай Indy и пользуйся. там очень много полезных вещей.


 
TButton   (2003-09-07 18:07) [5]

а я кста спрашивал, что в буфер скинуть, чтоб SendBuffer"ом отправить.


 
WhiteShadow   (2003-09-07 20:56) [6]


> Чую что надо копать в сторону SendBuffer, но пока сомневаюсь,
> не уверен что именно в этом буфере засылать, не попиксельно
> же мне имаджик транслировать... хотя если сохранить имаджик
> в файле типа байт, потом считать...

почему бы и нет. передаешь точечки а на удаленной машине их рисуешь.


 
TButton   (2003-09-07 21:18) [7]

а не слишком тормозно? у меня несколько десятков битмапов в памяти, и пара десятков клиентов время от времени (довольно часто) запрашивает у меня ети самые битмапы


 
Digitman   (2003-09-08 08:46) [8]


> выползла ерора "Socket must be in blocking mode" не найдя
> никакого моде в свойствах сокета


а св-во ClientType - это что по-твоему ? как раз и устанавливает режим

ctBlocking - блокирующий режим,
ctNonBlocking(св-во по умолчанию) - неблокирующий режим


 
TButton   (2003-09-08 15:59) [9]

ну во-первых ClientType это у клиента, а мне рассылать должен сервер. а во-вторых пробовал я ставить ServerType в stThreadBlocking, не помогло


 
Digitman   (2003-09-08 16:29) [10]


> не помогло


а в чем, собссно, проблема-то ?


 
TButton   (2003-09-08 17:44) [11]

вроде-бы что-то стало получаться

str:=TWinSocketStream.Create(ServerSocket1.Socket,0);
bmp:=TBitMap.Create;
bmp.LoadFromFile("image.bmp");
bmp.SaveToStream(str);
SpeedButton1.Caption:=IntToStr(SizeOf(bmp));
bmp.Free;
str.Free;


вот тока вместо сэйва дает "Write error -1". примечание: клиента как такового пока нет, для тестирования пользуюсь телнетом


 
Digitman   (2003-09-09 08:14) [12]


> вот тока вместо сэйва дает "Write error -1".


str:=TWinSocketStream.Create(ServerSocket1.Socket.Connections[..],0);


 
TButton   (2003-09-09 17:32) [13]

от оно что, т.е. я могу в onClientWrite написАть
str:=TWinSocketStream.Create(Socket,0);
и отсылать пикту клиенту который послал запрос.


 
Digitman   (2003-09-09 17:43) [14]


> TButton


ну да... что-то типо этого ... уже ближе к истине)


 
Zeon   (2003-09-10 02:13) [15]

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;

Нарыл где-то в FAQах этого сайта.
PS: Тримай земляче :-)



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

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

Наверх




Память: 0.49 MB
Время: 0.035 c
14-41975
mari
2003-10-24 10:22
2003.11.13
удаление пробелов из строки


1-41270
hepry
2003-10-31 14:38
2003.11.13
Правильная работа с ComboBox csDropDown


14-42119
Карелин Артем
2003-10-22 14:59
2003.11.13
Как восстановить пароль к аське??


1-41433
Andrey V.
2003-10-29 14:02
2003.11.13
О разнице вариантов создания формы ...


14-41921
kaif
2003-10-19 17:10
2003.11.13
Как грамотно писать: компонент или компонента?





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