Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
6-41779
Novenkij
2003-09-19 00:29
2003.11.13
локальная сеть


1-41662
rimas
2003-10-25 13:23
2003.11.13
res file


7-42155
Olexander
2003-09-01 15:17
2003.11.13
Thread + Win98 = ?


14-41982
Rouse_
2003-10-19 14:30
2003.11.13
Антология Мастера Улыбаются.


3-41033
Andrey V.
2003-10-15 08:47
2003.11.13
Туманный вопрос про дбгрид