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