Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |