Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Интернет, сети, протоколы > Простой способ отправки файлов


Автор: Song 30.11.03, 10:25
[doHTML]<pre><br>unit Unit1; <br><br>interface <br><br><b>uses</b> <br>  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, <br>  ScktComp, ExtCtrls, StdCtrls; <br><br><b>type</b> <br>  TForm1 = <b>class</b>(TForm) <br>    Image1: TImage; <br>    Image2: TImage; <br>    ClientSocket1: TClientSocket; <br>    ServerSocket1: TServerSocket; <br>    Button1: TButton; <br>    <b>procedure</b> Image1Click(Sender: TObject); <br>    <b>procedure</b> FormCreate(Sender: TObject); <br>    <b>procedure</b> ClientSocket1Connect(Sender: TObject; <br>      Socket: TCustomWinSocket); <br>    <b>procedure</b> ServerSocket1ClientRead(Sender: TObject; <br>      Socket: TCustomWinSocket); <br>    <b>procedure</b> ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); <br>  <b>private</b> <br>    { <b>Private</b> declarations } <br>    Reciving: boolean; <br>    DataSize: integer; <br>    Data: TMemoryStream; <br>  <b>public</b> <br>    { <b>Public</b> declarations } <br>  <b>end</b>; <br><br><b>var</b> <br>  Form1: TForm1; <br><br><b>implementation</b> <br><br>{$R *.DFM} <br><br><b>procedure</b> TForm1.Image1Click(Sender: TObject); <br><b>begin</b> <br>  //<i> Это процедура для открытия сокета на ПРИЁМ (RECEIVING). </i><br>  //<i> Button1.Click is this <b>procedure</b> as well. </i><br>  ClientSocket1.Active:= true; <br><b>end</b>; <br><br><b>procedure</b> TForm1.FormCreate(Sender: TObject); <br><b>begin</b> <br>  //<i> Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета. </i><br>  ServerSocket1.Active:= true; <br><b>end</b>; <br><br><b>procedure</b> TForm1.ClientSocket1Connect(Sender: TObject; <br>  Socket: TCustomWinSocket); <br><b>begin</b> <br>  //<i> Посылаем команду для начала передачи файла. </i><br>  Socket.SendText('send'); <br><b>end</b>; <br><br><b>procedure</b> TForm1.ClientSocket1Read(Sender: TObject; <br>  Socket: TCustomWinSocket); <br><b>var</b> <br>  s, sl: string; <br><b>begin</b> <br>  s:= Socket.ReceiveText; <br>  //<i> Если мы не в режиме приёма: </i><br>  <b>if</b> not Reciving <b>then</b> <br>  <b>begin</b> <br>    //<i> Теперь нам необходимо получить длину потока данных. </i><br>    SetLength(sl, StrLen(PChar(s))+1); //<i> +1 <b>for</b> the null terminator </i><br>    StrLCopy(@sl[1], PChar(s), Length(sl)-1); <br>    DataSize:= StrToInt(sl); <br>    Data:= TMemoryStream.Create; <br>    //<i> Удаляем информацию о размере из данных. </i><br>    Delete(s, 1, Length(sl)); <br>    Reciving:= true; <br>  <b>end</b>; <br>  //<i> Сохраняем данные в файл, до тех пор, пока не получим все данные. </i><br>  try <br>    Data.Write(s[1], length(s)); <br>    <b>if</b> Data.Size = DataSize <b>then</b> <br>    <b>begin</b> <br>      Data.Position:= 0; <br>      Image2.Picture.Bitmap.LoadFromStream(Data); <br>      Data.Free; <br>      Reciving:= false; <br>      Socket.Close; <br>    <b>end</b>; <br>  except <br>    Data.Free; <br>  <b>end</b>; <br><b>end</b>; <br><br><b>procedure</b> TForm1.ServerSocket1ClientRead(Sender: TObject; <br>  Socket: TCustomWinSocket); <br><b>var</b> <br>  ms: TMemoryStream; <br><b>begin</b> <br>  //<i> Клиент получает команду на передачу файла. </i><br>  <b>if</b> Socket.ReceiveText = 'send' <b>then</b> <br>  <b>begin</b> <br>    ms:= TMemoryStream.Create; <br>    try <br>      //<i> Получаем данные на передачу. </i><br>      Image1.Picture.Bitmap.SaveToStream(ms); <br>      ms.Position:= 0; <br>      //<i> Добавляем длину данных, чтобы клиент знал, сколько данных будет передано</i><br>      //<i> Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере. </i><br>      Socket.SendText(IntToStr(ms.Size) + #0); <br>      //<i> Посылаем его. </i><br>      Socket.SendStream(ms); <br>    except <br>      //<i> Итак, осталось освободить поток, если что-то не так. </i><br>      ms.Free; <br>    <b>end</b>; <br>  <b>end</b>; <br><b>end</b>; <br><br><b>end</b>.<br></pre><br>Автор <a href="mailto:mummud@hotmail.com">М.К.</a>[/doHTML]

Оригинал: http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=991237103&n=20

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)