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

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

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

Способ 1.

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


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

//Обработчик для сервера: 
procedure TForm1.NMStrmServ1MSG(SenderTComponent;
const 
sFromstringstrmTStream);
var
  
MyStreamTMemoryStream;
begin
  MyStream 
:= TMemoryStream.Create;
  
MyStream.CopyFrom(strmNMStrmServ1.BytesTotal);
  
MyStream.SaveToFile('c:\windows\1.jpg');
end
2 Способ.

рекомендую.


PHP код:
private
  { Private 
declarations }
  
Recivingboolean;
  
DataSizeinteger;
  
DataTMemoryStream;
...

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

procedure TForm1.ClientSocket1Read(SenderTObject;
SocketTCustomWinSocket);
var
  
sslstring;
  
JpgTJpegImage;
begin
  
...
  
// и тут сами определите откуда у вас Jpg
  
...
  
s:= Socket.ReceiveText;
  
// Если мы не в режиме приёма:
  
if not Reciving then
  begin
  
// Теперь нам необходимо получить длину потока данных.
    
SetLength(slStrLen(PChar(s))+1); // +1 for the null terminator
    
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
    
DataSize:= StrToInt(sl);
    
Data:= TMemoryStream.Create;
    
// Удаляем информацию о размере из данных.
    
Delete(s1Length(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(SenderTObject;
SocketTCustomWinSocket);
var
  
msTMemoryStream;
  
JpgTJpegImage;
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

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