|
Вопрос # 962/ вопрос решён / |
|
Здравствуйте, эксперты! Напишите пожалуйста пару примеров или ссылок, где рассматривается работа с компонентами TClientSocket и TServerSocket.
 |
Вопрос задал: alone (статус: Посетитель)
Вопрос отправлен: 6 октября 2007, 19:26
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Гадлевский Олег Вячеславович!
В новых версиях делфи от этой пары компонентов Борланд отказался и это понятно почему - они работают в асинхронном режиме. Хотя это и позволяет обходиться без потоков, но часто заметно усложняет логику приложения. Если вы просто решили начать изучение работы с сетью посредством этих компонентов, то я думаю это не лучшее решение.
Оптимальным будут компоненты Indy, для которых есть много примеров на их сайте (indyproject.org). К тому же там есть готовые HTTP клиент и сервер, SMTP, POP, TCP. Даже IRC клиент и сервер. На этом же сайте есть примеры по каждому компоненту.
Также неплохо будет изучить работу с потоками и тогда ваши сетевые приложения станут на порядок лучше. Для затравки можете ознакомиться с моей статьей на этом сайте
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 октября 2007, 23:04
Оценка за ответ: 5
Комментарий к оценке: Спасибо, Вадим! ;) Последую Вашему совету, буду изучать.
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Гадлевский Олег Вячеславович!
Смотрите одним глазом примеры в Приложении, а другим - на совет "Вадим К", все-таик он прав.
Приложение: Переключить в обычный режим-
-
- unit Unit1;
-
- interface
-
- uses
-
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ScktComp, ExtCtrls, StdCtrls;
-
- type
-
- TForm1 = class(TForm)
- Image1: TImage;
- Image2: TImage;
- ClientSocket1: TClientSocket;
- ServerSocket1: TServerSocket;
- Button1: TButton;
- procedure Image1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure ClientSocket1Connect(Sender: TObject;
- Socket: TCustomWinSocket);
- procedure ServerSocket1ClientRead(Sender: TObject;
- Socket: TCustomWinSocket);
- 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.Image1Click(Sender: TObject);
- begin
-
- // Button1.Click is this procedure as well.
- ClientSocket1.Active:= true;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
-
- ServerSocket1.Active:= true;
- end;
-
- procedure TForm1.ClientSocket1Connect(Sender: TObject;
- Socket: TCustomWinSocket);
- begin
-
- Socket.SendText('send');
- 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;
-
- 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;
-
-
- Socket.SendText(IntToStr(ms.Size) + #0);
-
- Socket.SendStream(ms);
- except
-
- ms.Free;
- end;
- end;
- end;
-
- end.
-
-
-
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ScktComp, StdCtrls;
-
- type
-
- TForm1 = class(TForm)
- ClientSocket1: TClientSocket;
- ServerSocket1: TServerSocket;
- btnTestSockets: TButton;
- procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure ClientSocket1Disconnect(Sender: TObject;
- Socket: TCustomWinSocket);
- procedure ClientSocket1Connect(Sender: TObject;
- Socket: TCustomWinSocket);
- procedure ServerSocket1ClientConnect(Sender: TObject;
- Socket: TCustomWinSocket);
- procedure btnTestSocketsClick(Sender: TObject);
- private
- FStream: TFileStream;
- { Private-Deklarationen }
- public
- { Public-Deklarationen }
- end;
-
- var
-
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.ClientSocket1Read(Sender: TObject;
- Socket: TCustomWinSocket);
- var
- iLen: Integer;
- Bfr: Pointer;
- begin
- iLen := Socket.ReceiveLength;
- GetMem(Bfr, iLen);
- try
- Socket.ReceiveBuf(Bfr^, iLen);
- FStream.Write(Bfr^, iLen);
- finally
- FreeMem(Bfr);
- end;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- FStream := nil;
- end;
-
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- if Assigned(FStream) then
- begin
- FStream.Free;
- FStream := nil;
- end;
- end;
-
- procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
- Socket: TCustomWinSocket);
- begin
- if Assigned(FStream) then
- begin
- FStream.Free;
- FStream := nil;
- end;
- end;
-
- procedure TForm1.ClientSocket1Connect(Sender: TObject;
- Socket: TCustomWinSocket);
- begin
- FStream := TFileStream.Create('c:temptest.stream.html', fmCreate or fmShareDenyWrite);
- end;
-
- procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
- Socket: TCustomWinSocket);
- begin
- Socket.SendStream(TFileStream.Create('c:temptest.html', fmOpenRead or fmShareDenyWrite));
- end;
-
- procedure TForm1.btnTestSocketsClick(Sender: TObject);
- begin
- ServerSocket1.Active := True;
- ClientSocket1.Active := True;
- end;
-
- end.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 8 октября 2007, 11:30
Оценка за ответ: 5
Комментарий к оценке: Спасибо за пример
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 6 октября 2007, 20:43; участников в обсуждении: 1.
|
min@y™ (статус: Доктор наук), 6 октября 2007, 20:43 [#1]:
Согласен: удаление моего ответа справедливо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|