Форум: "Начинающим";
Текущий архив: 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