Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

Клиент-серверное приложение   Найти похожие ветки 

 
Sasha   (2008-12-01 12:51) [0]

Уважаемые мастера, подскажите пожалуйста как с помощью компонентов TTCPServer и TTCPClient передать файл (не текстовый) с сервера на клиент?

Попробывал не получается. Вот мой код:
Для клиента
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ScktComp, StdCtrls, ExtCtrls, jpeg;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ClientSocket1: TClientSocket;
   Image2: TImage;
   procedure ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure Button1Click(Sender: TObject);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
 private
   { Private declarations }
   Reciving: boolean;
   DataSize: integer;
   Data: TMemoryStream;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText("send");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active:= true;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket); var  s, sl: string;
begin
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;
     Image2.Picture.Bitmap.LoadFromStream(Data);
     Data.Free;
     Reciving:= false;
     Socket.Close;
   end;
 except
   Data.Free;
end;
end;

end.

Для сервера:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, ScktComp, jpeg;

type
 TForm1 = class(TForm)
   ServerSocket1: TServerSocket;
   Image1: TImage;
   procedure ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

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

end.

Но ни чего не выходит. Картинка не переходит ни с сервера на клиент, ни с клиента на сервер. Подскажите где ошибка


 
Сергей М. ©   (2008-12-01 12:55) [1]


> как с помощью компонентов TTCPServer и TTCPClient


И где здесь TTCPServer и TTCPClient ?
Я вижу cjdctv lheubt rjvgjytyns - TServerSocket и TClientSocket //


 
Sasha   (2008-12-01 12:59) [2]

Извините не то написал. Конечно же TServerSocket и TClientSocket. Подскажите что не так в коде. Компилируется без ошибок


 
Сергей М. ©   (2008-12-01 13:02) [3]

Ошибки начинаются здесь:

> if Socket.ReceiveText = "send" then


if-условие не обязано быть истинным


 
Sasha   (2008-12-01 13:41) [4]


> if-условие не обязано быть истинным

Его надо вообще убрать?


 
Сергей М. ©   (2008-12-01 13:43) [5]

Да.
В таком виде оно никуда не годится.


 
Sasha   (2008-12-01 13:46) [6]


> Да.
> В таком виде оно никуда не годится.

Подскажите, пожалуйста, как нужно переделать, чтобы правильно было


 
Сергей М. ©   (2008-12-01 13:50) [7]

А чем Indy-компоненты не угодили ?


 
Sasha   (2008-12-01 13:56) [8]

Вот решил на этих попробывать сначало. На Indy не знаю как.


 
Сергей М. ©   (2008-12-01 13:59) [9]

Да ты и на этих не знаешь ..

При прочих равных условиях "незнания" Инди предпочтительней - там есть методы ReadLn/WriteLn, делающие как раз то чего недостает в твоем коде и чего ты не понимаешь в принципе.

Так может быть стоит пока не поздно завернуть оглобли в сторону Инди ? Или - даже лучше - в сторону ICS ?


 
Sasha   (2008-12-01 14:03) [10]


> там есть методы ReadLn/WriteLn, делающие как раз то чего
> недостает в твоем коде

но ведь методы ReadLn/WriteLn текстовые. А мне надо картинку переслать. И как с ReadLn/WriteLn работать с типом TMemoryStream?


 
Сергей М. ©   (2008-12-01 14:06) [11]

Причем здесь твоя картинка ?
До нее еще как до Китая раком ползти)

Я ж тебе показал с какого места начинаются проблемы - там никакими картинками не пахнет, а пахнет передачей/приемом строки текста ..


 
Sasha   (2008-12-01 14:13) [12]

А в коде коде клиента все нормально?


 
Сергей М. ©   (2008-12-01 14:17) [13]

В коде клиента грабли точно так же начинаются с работы с текстом

> Socket.SendText("send");


SendText - это функция !


 
Sasha   (2008-12-01 14:21) [14]

А как тогда сервер узнает что ему надо передать картинку?


 
Сергей М. ©   (2008-12-01 14:23) [15]

А прежде чем сервер что-то получит, это "что-то" нужно сначала гарантированно передать.
На основании чего ты уверен, что SendText гарантированно передаст указанную тобой строку ?


 
Sasha   (2008-12-01 14:25) [16]

А как тогда реализовать код? Может подскажите где почитать про передачу данных таким способом?


 
Сергей М. ©   (2008-12-01 14:37) [17]


> где почитать про передачу данных таким способом


Да прямо в станд.справке и почитай, на то и справка.


 
Sasha   (2008-12-01 14:41) [18]

Там по английски. Мне бы по русски


 
Leonid Troyanovsky ©   (2008-12-01 14:50) [19]


> Sasha   (01.12.08 14:41) [18]

> Там по английски. Мне бы по русски

А можем и вслух почитать - включи наушники.

--
Regards, LVT.


 
Сергей М. ©   (2008-12-01 14:50) [20]

Ну надо же какой ты застенчивый !
Нет бы сразу честно предупредить, мол, по-буржуйски нибельмеса не понимаю)..

Хорошо, вот перевод:

Функция SendText возвращает число байт, фактически поставленных в очередь передачи. Заметьте, что это число может быть меньше длины строки S, если сокет работает в неблокирующем режиме.


 
Sasha   (2008-12-01 17:37) [21]

А где можно почитать про передачу данных по Sоcket?


 
Slym ©   (2008-12-02 05:33) [22]

вот тут
http://delphimaster.net/view/6-1227604925/



Страницы: 1 вся ветка

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
2-1228154721
Макс123
2008-12-01 21:05
2009.01.18
Прокрутка картинки


2-1228402429
учащийся
2008-12-04 17:53
2009.01.18
YearsBetween


2-1228396134
aglar
2008-12-04 16:08
2009.01.18
Как получить значения subitems в listview


2-1228221610
givi
2008-12-02 15:40
2009.01.18
Имя ПК


2-1228767507
Platto
2008-12-08 23:18
2009.01.18
TComboBox