ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

отправка прием картинки Socket Server&Client Delphi
  #1  
Старый 22.05.2008, 12:24
Аватар для Flame of Soul
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию отправка прием картинки Socket Server&Client Delphi

отправляю:
PHP код:
       fs:=TMemoryStream.Create;
       
Image1.Picture.Bitmap.SaveToStream(fs);
       
ServerSocket1.Socket.SendStream(fs); 
принимаю:
PHP код:
procedure TForm1.Button1Click(SenderTObject);
begin
ClientSocket1
.Active:=true;
end;

procedure TForm1.Button2Click(SenderTObject);
begin
ClientSocket1
.Active:=false;
end;

procedure TForm1.ClientSocket1Read(SenderTObject;
  
SocketTCustomWinSocket);
  var
  
sstring;
begin
  s
:=Socket.ReceiveText;
  
Reciving:=true;
  
ClientSocket1.Socket.ReceiveBuf(s,DataSize);
  
fs.WriteBuffer(s,DataSize);
  
Image1.Picture.Bitmap.LoadFromStream(fs);
  
end
что не правильно в приеме
 
Ответить с цитированием

  #2  
Старый 22.05.2008, 17:41
Аватар для x0man
x0man
Познающий
Регистрация: 24.02.2006
Сообщений: 34
Провел на форуме:
136883

Репутация: 50
По умолчанию

картинка должна передаваться не сразу куском, а по блокам определённого размера...
и думаю стоит поменять s : string; на buf : array [0..1024] of byte;
и если учесть что TImage - это штука глючная, то лучше загружай картинку через TBitmap а потом уже рисуй её куданить на форму... ну или на жёсткий сохрани...
 
Ответить с цитированием

  #3  
Старый 22.05.2008, 18:13
Аватар для Jes
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
По умолчанию

имхо тоже , лучше разбить по байтам , и имхо еще лучше сделать опознавательный байт в начале блока , чтобы пакеты картинки от других фильтровать ...
 
Ответить с цитированием

  #4  
Старый 22.05.2008, 18:29
Аватар для x0man
x0man
Познающий
Регистрация: 24.02.2006
Сообщений: 34
Провел на форуме:
136883

Репутация: 50
По умолчанию

Цитата:
Сообщение от Jes  
имхо тоже , лучше разбить по байтам
Зачем же разбивать, она итак отправляется по блокам... через SendBuf...

а вообще я делал так....

если передаём с сервера картинку, оповещаем клиента об её ожидании... посылая клиенту сообщение через SendText, 'imgXXXXXXXX'
где XXXXXXXX - размер картинки в HEX виде...
затем устанавливаем флаг (в клиенте) о приёме оной и занося в какую либо переменную размер картинки
RecvImage := True
ImageSize := XXXXXXXX

далее просто от общего размера, есстественно отнимаем то число, которое показывает размер блока что был принят...

ну и всё... вроде...

Последний раз редактировалось x0man; 22.05.2008 в 18:36..
 
Ответить с цитированием

  #5  
Старый 22.05.2008, 18:32
Аватар для Jes
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
По умолчанию

это имхо (+ приверженство к hand made )
 
Ответить с цитированием

  #6  
Старый 22.05.2008, 18:36
Аватар для desTiny
desTiny
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
 
Ответить с цитированием

  #7  
Старый 22.05.2008, 18:37
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

2 Flame
не разбираясь в делфи!
>> s:=Socket.ReceiveText;
ноль ограниченный режим или чего это за шняга?


/// одним словом непохек работать с сокетом на высоком уровне!

Последний раз редактировалось Delimiter; 22.05.2008 в 18:46..
 
Ответить с цитированием

  #8  
Старый 22.05.2008, 23:33
Аватар для t04
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

жесть. читай файл в буфер и просто высылай буфер. а вообще пора забыть эти TServerSocket & TClientSocket, юзай модуль WinSock.
 
Ответить с цитированием

  #9  
Старый 23.05.2008, 00:29
Аватар для Hellsp@wn
Hellsp@wn
Постоянный
Регистрация: 29.04.2007
Сообщений: 496
Провел на форуме:
2715445

Репутация: 588
По умолчанию

не используйте Stream'ы, это от лукавого пишите на апи - это хек! а строка под буфер, это нонсенс...

велком ->> http://www.delphikingdom.com/
 
Ответить с цитированием

  #10  
Старый 23.05.2008, 18:46
Аватар для /Boom\
/Boom\
Познающий
Регистрация: 14.02.2008
Сообщений: 62
Провел на форуме:
335706

Репутация: 4
По умолчанию

PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsExtCtrlsStdCtrlsIdBaseComponentIdComponent,
  
IdTCPConnectionIdTCPClient;

type
  TForm1 
= class(TForm)
    
imgScreenTImage;
    
GroupBox1TGroupBox;
    
txtServerTEdit;
    
IdTCPClient1TIdTCPClient;
    
cmbConnectTButton;
    
GroupBox2TGroupBox;
    
Label1TLabel;
    
Label3TLabel;
    
lblResolutionTLabel;
    
lblColorsTLabel;
    
Timer1TTimer;
    
procedure cmbConnectClick(SenderTObject);
    
procedure IdTCPClient1Connected(SenderTObject);
    
procedure IdTCPClient1Disconnected(SenderTObject);
    
procedure Timer1Timer(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.cmbConnectClick(SenderTObject);
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(SenderTObject);
begin
  txtServer
.Enabled := False;
  
cmbConnect.Caption := 'Отключиться';
  
//Начинаем периодически запрашивать данные с сервера
  
Timer1.Enabled := True;
  
//Выполним первый запрос сами
  
Timer1Timer (Nil);
end;

procedure TForm1.IdTCPClient1Disconnected(SenderTObject);
begin
  txtServer
.Enabled := True;
  
cmbConnect.Caption := 'Подключиться';
  
Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(SenderTObject);
var
  
streamTMemoryStream;
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
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi smtp socket eroor 10080 anti_sec2 Болталка 3 09.05.2008 18:12



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ