Форум: "Сети";
Текущий архив: 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