Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
отправка прием картинки Socket Server&Client Delphi |

22.05.2008, 12:24
|
|
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме: 1740746
Репутация:
435
|
|
отправка прием картинки Socket Server&Client Delphi
отправляю:
PHP код:
fs:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(fs);
ServerSocket1.Socket.SendStream(fs);
принимаю:
PHP код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=false;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s: string;
begin
s:=Socket.ReceiveText;
Reciving:=true;
ClientSocket1.Socket.ReceiveBuf(s,DataSize);
fs.WriteBuffer(s,DataSize);
Image1.Picture.Bitmap.LoadFromStream(fs);
end;
что не правильно в приеме
|
|
|

22.05.2008, 17:41
|
|
Познающий
Регистрация: 24.02.2006
Сообщений: 34
Провел на форуме: 136883
Репутация:
50
|
|
картинка должна передаваться не сразу куском, а по блокам определённого размера...
и думаю стоит поменять s : string; на buf : array [0..1024] of byte;
и если учесть что TImage - это штука глючная, то лучше загружай картинку через TBitmap а потом уже рисуй её куданить на форму... ну или на жёсткий сохрани...
|
|
|

22.05.2008, 18:13
|
|
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме: 3371897
Репутация:
1462
|
|
имхо тоже , лучше разбить по байтам , и имхо еще лучше сделать опознавательный байт в начале блока , чтобы пакеты картинки от других фильтровать ...
|
|
|

22.05.2008, 18:29
|
|
Познающий
Регистрация: 24.02.2006
Сообщений: 34
Провел на форуме: 136883
Репутация:
50
|
|
Сообщение от Jes
имхо тоже , лучше разбить по байтам
Зачем же разбивать, она итак отправляется по блокам... через SendBuf...
а вообще я делал так....
если передаём с сервера картинку, оповещаем клиента об её ожидании... посылая клиенту сообщение через SendText, 'imgXXXXXXXX'
где XXXXXXXX - размер картинки в HEX виде...
затем устанавливаем флаг (в клиенте) о приёме оной и занося в какую либо переменную размер картинки
RecvImage := True
ImageSize := XXXXXXXX
далее просто от общего размера, есстественно отнимаем то число, которое показывает размер блока что был принят...
ну и всё... вроде...
Последний раз редактировалось x0man; 22.05.2008 в 18:36..
|
|
|

22.05.2008, 18:32
|
|
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме: 3371897
Репутация:
1462
|
|
это имхо (+ приверженство к hand made )
|
|
|

22.05.2008, 18:36
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Ещё, если уж потоки - это тру, то имхо (  ) лучше уж использовать TStrtingStream
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

22.05.2008, 18:37
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
2 Flame
не разбираясь в делфи!
>> s:=Socket.ReceiveText;
ноль ограниченный режим или чего это за шняга?
/// одним словом непохек работать с сокетом на высоком уровне! 
Последний раз редактировалось Delimiter; 22.05.2008 в 18:46..
|
|
|

22.05.2008, 23:33
|
|
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме: 246020
Репутация:
105
|
|
жесть. читай файл в буфер и просто высылай буфер. а вообще пора забыть эти TServerSocket & TClientSocket, юзай модуль WinSock.
|
|
|

23.05.2008, 00:29
|
|
Постоянный
Регистрация: 29.04.2007
Сообщений: 496
Провел на форуме: 2715445
Репутация:
588
|
|
не используйте Stream'ы, это от лукавого  пишите на апи - это хек! а строка под буфер, это нонсенс...
велком ->> http://www.delphikingdom.com/
|
|
|

23.05.2008, 18:46
|
|
Познающий
Регистрация: 14.02.2008
Сообщений: 62
Провел на форуме: 335706
Репутация:
4
|
|
PHP код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;
type
TForm1 = class(TForm)
imgScreen: TImage;
GroupBox1: TGroupBox;
txtServer: TEdit;
IdTCPClient1: TIdTCPClient;
cmbConnect: TButton;
GroupBox2: TGroupBox;
Label1: TLabel;
Label3: TLabel;
lblResolution: TLabel;
lblColors: TLabel;
Timer1: TTimer;
procedure cmbConnectClick(Sender: TObject);
procedure IdTCPClient1Connected(Sender: TObject);
procedure IdTCPClient1Disconnected(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.cmbConnectClick(Sender: TObject);
begin
if (cmbConnect.Caption = 'Подключиться') then
begin
if (txtServer.Text = '') then
//Не введено имя сервера
MessageDlg('Введите имя машины-сервера в текстовое поле',
mtInformation, [mbOK], 0)
else begin
//Подключаемся к серверу
IdTCPClient1.Host := txtServer.Text;
try
IdTCPClient1.Connect;
except
MessageDlg('Не удается соединиться с указанным сервером',
mtError, [mbOK], 0);
Exit;
end;
end
end
else begin
//Отключается от сервера
IdTCPClient1.Disconnect;
end;
end;
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
txtServer.Enabled := False;
cmbConnect.Caption := 'Отключиться';
//Начинаем периодически запрашивать данные с сервера
Timer1.Enabled := True;
//Выполним первый запрос сами
Timer1Timer (Nil);
end;
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
txtServer.Enabled := True;
cmbConnect.Caption := 'Подключиться';
Timer1.Enabled := False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
stream: TMemoryStream;
begin
//Запрашиваем у сервера данные о наблюдаемом компьютере
with (IdTCPClient1) do
begin
//...разрешение
WriteLn('get_screen_width');
WriteLn('get_screen_height');
lblResolution.Caption := IntToStr(ReadInteger) + 'x'
+ IntToStr(ReadInteger);
//...глубина цвета
WriteLn('get_screen_colors');
lblColors.Caption := IntToStr(ReadInteger);
//...копия экрана
//.....первый вариант - копирование экрана без сжатия
// WriteLn('get_screen');
//.....второй вариант - сжатие на стороне сервера
WriteLn('get_screen:' + IntToStr(imgScreen.Width) + ',' +
IntToStr(imgScreen.Height));
//....получаем данные
stream := TMemoryStream.Create;
ReadStream(stream);
stream.Position := 0;
//....формируем изображение
imgScreen.Picture.Bitmap.LoadFromStream(stream);
stream.Clear;
stream.Free;
end;
end;
end.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|