Показать сообщение отдельно

  #4  
Старый 10.05.2009, 17:03
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
С нами: 9980798

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

Способ 1.

Можно воспользоваться компонентами TNMStrmServ и TNMStrm. Они специально предназначены для обмена потоками данных.


PHP код:
//Обработчик для клиента: 
var
  
MyStream: TMemoryStream;
  
Jpg: TJpegImage;
begin
  
...
  
//тут сами определите как у вас появляется Jpg
  
... 
  
MyStream := TMemoryStream.Create;
  
Jpg.SaveToStream(MyStream);
  
NMStrm1.PostIt(MyStream);
  
MyStream.Free;
end;

//Обработчик для сервера: 
procedure TForm1.NMStrmServ1MSG(Sender: TComponent;
const 
sFrom: string; strm: TStream);
var
  
MyStream: TMemoryStream;
begin
  MyStream 
:= TMemoryStream.Create;
  
MyStream.CopyFrom(strm, NMStrmServ1.BytesTotal);
  
MyStream.SaveToFile('c:\windows\1.jpg');
end; 
2 Способ.

рекомендую.


PHP код:
private
  { Private 
declarations }
  
Reciving: boolean;
  
DataSize: integer;
  
Data: TMemoryStream;
...

...
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
  
// Посылаем команду для начала передачи файла.
  
Socket.SendText('send');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
  
s, sl: string;
  
Jpg: TJpegImage;
begin
  
...
  
// и тут сами определите откуда у вас Jpg
  
...
  
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;
      
Jpg.LoadFromStream(Data);
      
Data.Free;
      
Reciving:= false;
      
Socket.Close;
    
end;
  
except
    Data
.Free;
  
end;
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
  
ms: TMemoryStream;
  
Jpg: TJpegImage;
begin
  
...
  
// и даже тут сами определите откуда у вас Jpg
  
...
  
// Клиент получает команду на передачу файла.
  
if Socket.ReceiveText = 'send' then
  begin
    ms
:= TMemoryStream.Create;
    try
      
// Получаем данные на передачу.
      
Jpg.SaveToStream(ms);
      
ms.Position:= 0;
      
// Добавляем длину данных, чтобы клиент знал,
      // сколько данных будет передано
      // Добавляем #0 , чтобы можно было определить,
      // где заканчивается информация о размере.
      
Socket.SendText(IntToStr(ms.Size) + #0);
      // Посылаем его.
      
Socket.SendStream(ms);
    
except
      
// Итак, осталось освободить поток, если что-то не так.
      
ms.Free;
    
end;
  
end;
end;

end. 

удачи в написании))) не забывайте передавать зашифрованные данные.
 
Ответить с цитированием