Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.01.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




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


2-1228698109
S
2008-12-08 04:01
2009.01.18
IBEvents в DLL


2-1228195255
Sw
2008-12-02 08:20
2009.01.18
Тип данных


15-1227434110
{RASkov}
2008-11-23 12:55
2009.01.18
Нет звука


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский