Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 962

/ вопрос решён /

Здравствуйте, эксперты! Напишите пожалуйста пару примеров или ссылок, где рассматривается работа с компонентами TClientSocket и TServerSocket.

alone Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: alone (статус: Посетитель)
Вопрос отправлен: 6 октября 2007, 19:26
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Гадлевский Олег Вячеславович!
В новых версиях делфи от этой пары компонентов Борланд отказался и это понятно почему - они работают в асинхронном режиме. Хотя это и позволяет обходиться без потоков, но часто заметно усложняет логику приложения. Если вы просто решили начать изучение работы с сетью посредством этих компонентов, то я думаю это не лучшее решение.
Оптимальным будут компоненты Indy, для которых есть много примеров на их сайте (indyproject.org). К тому же там есть готовые HTTP клиент и сервер, SMTP, POP, TCP. Даже IRC клиент и сервер. На этом же сайте есть примеры по каждому компоненту.

Также неплохо будет изучить работу с потоками и тогда ваши сетевые приложения станут на порядок лучше. Для затравки можете ознакомиться с моей статьей на этом сайте

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 октября 2007, 23:04
Оценка за ответ: 5

Комментарий к оценке: Спасибо, Вадим! ;) Последую Вашему совету, буду изучать.

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, Гадлевский Олег Вячеславович!
Смотрите одним глазом примеры в Приложении, а другим - на совет "Вадим К", все-таик он прав.

Приложение:
  1.  
  2.  
  3. unit Unit1;
  4.  
  5. interface
  6.  
  7. uses
  8.  
  9. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  10. ScktComp, ExtCtrls, StdCtrls;
  11.  
  12. type
  13.  
  14. TForm1 = class(TForm)
  15. Image1: TImage;
  16. Image2: TImage;
  17. ClientSocket1: TClientSocket;
  18. ServerSocket1: TServerSocket;
  19. Button1: TButton;
  20. procedure Image1Click(Sender: TObject);
  21. procedure FormCreate(Sender: TObject);
  22. procedure ClientSocket1Connect(Sender: TObject;
  23. Socket: TCustomWinSocket);
  24. procedure ServerSocket1ClientRead(Sender: TObject;
  25. Socket: TCustomWinSocket);
  26. procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  27.  
  28. private
  29. { Private declarations }
  30. Reciving: boolean;
  31. DataSize: integer;
  32. Data: TMemoryStream;
  33. public
  34. { Public declarations }
  35. end;
  36.  
  37. var
  38. Form1: TForm1;
  39.  
  40. implementation
  41.  
  42. {$R *.DFM}
  43.  
  44. procedure TForm1.Image1Click(Sender: TObject);
  45. begin
  46.  
  47. // Button1.Click is this procedure as well.
  48. ClientSocket1.Active:= true;
  49. end;
  50.  
  51. procedure TForm1.FormCreate(Sender: TObject);
  52. begin
  53.  
  54. ServerSocket1.Active:= true;
  55. end;
  56.  
  57. procedure TForm1.ClientSocket1Connect(Sender: TObject;
  58. Socket: TCustomWinSocket);
  59. begin
  60.  
  61. Socket.SendText('send');
  62. end;
  63.  
  64. procedure TForm1.ClientSocket1Read(Sender: TObject;
  65. Socket: TCustomWinSocket);
  66. var
  67. s, sl: string;
  68. begin
  69. s:= Socket.ReceiveText;
  70.  
  71. if not Reciving then
  72. begin
  73.  
  74. SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
  75. StrLCopy(@sl[1], PChar(s), Length(sl)-1);
  76. DataSize:= StrToInt(sl);
  77. Data:= TMemoryStream.Create;
  78.  
  79. Delete(s, 1, Length(sl));
  80. Reciving:= true;
  81. end;
  82.  
  83. try
  84. Data.Write(s[1], length(s));
  85. if Data.Size = DataSize then
  86. begin
  87. Data.Position:= 0;
  88. Image2.Picture.Bitmap.LoadFromStream(Data);
  89. Data.Free;
  90. Reciving:= false;
  91. Socket.Close;
  92. end;
  93. except
  94. Data.Free;
  95. end;
  96. end;
  97.  
  98. procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  99. Socket: TCustomWinSocket);
  100. var
  101. ms: TMemoryStream;
  102. begin
  103.  
  104. if Socket.ReceiveText = 'send' then
  105. begin
  106. ms:= TMemoryStream.Create;
  107. try
  108.  
  109. Image1.Picture.Bitmap.SaveToStream(ms);
  110. ms.Position:= 0;
  111.  
  112.  
  113. Socket.SendText(IntToStr(ms.Size) + #0);
  114.  
  115. Socket.SendStream(ms);
  116. except
  117.  
  118. ms.Free;
  119. end;
  120. end;
  121. end;
  122.  
  123. end.
  124.  
  125.  
  126.  
  127.  
  128. unit Unit1;
  129.  
  130. interface
  131.  
  132. uses
  133. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  134. Dialogs, ScktComp, StdCtrls;
  135.  
  136. type
  137.  
  138. TForm1 = class(TForm)
  139. ClientSocket1: TClientSocket;
  140. ServerSocket1: TServerSocket;
  141. btnTestSockets: TButton;
  142. procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  143. procedure FormCreate(Sender: TObject);
  144. procedure FormDestroy(Sender: TObject);
  145. procedure ClientSocket1Disconnect(Sender: TObject;
  146. Socket: TCustomWinSocket);
  147. procedure ClientSocket1Connect(Sender: TObject;
  148. Socket: TCustomWinSocket);
  149. procedure ServerSocket1ClientConnect(Sender: TObject;
  150. Socket: TCustomWinSocket);
  151. procedure btnTestSocketsClick(Sender: TObject);
  152. private
  153. FStream: TFileStream;
  154. { Private-Deklarationen }
  155. public
  156. { Public-Deklarationen }
  157. end;
  158.  
  159. var
  160.  
  161. Form1: TForm1;
  162.  
  163. implementation
  164.  
  165. {$R *.dfm}
  166.  
  167. procedure TForm1.ClientSocket1Read(Sender: TObject;
  168. Socket: TCustomWinSocket);
  169. var
  170. iLen: Integer;
  171. Bfr: Pointer;
  172. begin
  173. iLen := Socket.ReceiveLength;
  174. GetMem(Bfr, iLen);
  175. try
  176. Socket.ReceiveBuf(Bfr^, iLen);
  177. FStream.Write(Bfr^, iLen);
  178. finally
  179. FreeMem(Bfr);
  180. end;
  181. end;
  182.  
  183. procedure TForm1.FormCreate(Sender: TObject);
  184. begin
  185. FStream := nil;
  186. end;
  187.  
  188. procedure TForm1.FormDestroy(Sender: TObject);
  189. begin
  190. if Assigned(FStream) then
  191. begin
  192. FStream.Free;
  193. FStream := nil;
  194. end;
  195. end;
  196.  
  197. procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  198. Socket: TCustomWinSocket);
  199. begin
  200. if Assigned(FStream) then
  201. begin
  202. FStream.Free;
  203. FStream := nil;
  204. end;
  205. end;
  206.  
  207. procedure TForm1.ClientSocket1Connect(Sender: TObject;
  208. Socket: TCustomWinSocket);
  209. begin
  210. FStream := TFileStream.Create('c:temptest.stream.html', fmCreate or fmShareDenyWrite);
  211. end;
  212.  
  213. procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  214. Socket: TCustomWinSocket);
  215. begin
  216. Socket.SendStream(TFileStream.Create('c:temptest.html', fmOpenRead or fmShareDenyWrite));
  217. end;
  218.  
  219. procedure TForm1.btnTestSocketsClick(Sender: TObject);
  220. begin
  221. ServerSocket1.Active := True;
  222. ClientSocket1.Active := True;
  223. end;
  224.  
  225. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 8 октября 2007, 11:30
Оценка за ответ: 5

Комментарий к оценке: Спасибо за пример

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 6 октября 2007, 20:43; участников в обсуждении: 1.
min@y™

min@y™ (статус: Доктор наук), 6 октября 2007, 20:43 [#1]:

Согласен: удаление моего ответа справедливо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.02 сек.