powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с сокетами в блокирующем режиме
20 сообщений из 20, страница 1 из 1
Работа с сокетами в блокирующем режиме
    #39727644
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поток для клиента описан следующим образом

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TServerThread.ClientExecute;
begin
  while not Terminated do
  begin
    txt:=ClientSocket.ReceiveText;
    if txt='TEXT' then
    begin
      Synchronize(Update);
      ClientSocket.SendText('Привет');
    end;
  end;
end;
procedure TServerThread.Update;
begin
  Form1.cmd.Lines.Add(txt);
end;



По нажатию батона клиент всякий раз отсылает 'TEXT'. И сервер каждый раз его получает нормально.
Но почему клиент не получает 'Привет'? Обработчик OnRead не срабатывает.
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727667
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rusНо почему клиент не получает 'Привет'? Обработчик OnRead не срабатывает.

Поскольку кода клиента ты не показал, вангую, что он из сокета не читает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727669
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, братан, привожу код
Код: pascal
1.
2.
3.
4.
procedure TForm1.CliRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  cmd.Lines.Add(Socket.ReceiveText);
end;


Как же я мог забыть его привести.
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727670
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, отправка
Код: pascal
1.
2.
3.
4.
procedure TForm1.Button5Click(Sender: TObject);
begin
  if Cli.Active then Cli.Socket.SendText('TEXT');
end;
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727672
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, вабанк кидаю текст юнита. Клиент и сервер в одной программе


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
unit Unit1;

interface

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

type
    TServerThread = class(TServerClientThread)
    txt: string;
    procedure ClientExecute; override;
    procedure Update;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Cli: TClientSocket;
    Serv: TServerSocket;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    cmd: TMemo;
    Button5: TButton;
    Button6: TButton;
    SelFile: TOpenDialog;
    Button7: TButton;
    Button8: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ServClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button3Click(Sender: TObject);
    procedure ServClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServGetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    procedure ServClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ServClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure CliDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure CliError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure CliRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  F,FN: TFileStream;

implementation

{$R *.dfm}

procedure TServerThread.ClientExecute;
begin
  while not Terminated do
  begin

    txt:=ClientSocket.ReceiveText;

    if txt='TEXT' then
    begin
      Synchronize(Update);
      ClientSocket.SendText('Ïðèâåò');
      //ClientSocket.Close;
      //Terminate;
    end;
  end;
end;

procedure TServerThread.Update;
begin
  Form1.cmd.Lines.Add(txt);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Serv.Port:=6600;
  Serv.ServerType:=stThreadBlocking;
  Serv.Active:=true;
  cmd.Lines.Add('Server started');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Serv.Active:=false;
  cmd.Lines.Add('Îñòàíîâëåí');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Cli.Host:='localhost';
  Cli.Port:=6600;
  Cli.ClientType:=ctBlocking;
  Cli.Active:=true;
  cmd.Lines.Add('Cli Connecting...');
end;

procedure TForm1.ServClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  cmd.Lines.Add('Connect');
  //FN:= TFileStream.Create('c:\temp\new.txt',fmCreate);
  //FN.Position:=0;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Cli.Active:=false; ;//(Cli.Socket.Handle);
  cmd.Lines.Add('Disconnecting...');
end;

procedure TForm1.ServClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  //FN.Free;

  cmd.Lines.Add('Disconnect');
end;

procedure TForm1.ServGetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  cmd.Lines.Add('GetThread');
      SocketThread:=TServerThread.Create(true, ClientSocket);
      SocketThread.Priority:=tpNormal;
      SocketThread.FreeOnTerminate:=true;
      SocketThread.Resume;
end;

procedure TForm1.ServClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  cmd.Lines.Add('Error '+ inttostr(ErrorCode));
  ErrorCode:=0;
end;

procedure TForm1.ServClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Buf: array [0..8192] of Char;
    IncLen,BufLen: integer;
begin
  cmd.Lines.Add('!!!!!!!!!!ÏÐÈÍßÒÎ!!!!!!!!!!!');
  IncLen:=Socket.ReceiveLength;
  while IncLen>0 do
  begin
    BufLen:=Socket.ReceiveBuf(Buf,SizeOf(Buf));
    if BufLen<=0 then break else FN.WriteBuffer(Buf,BufLen);
  end;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  if Cli.Active then Cli.Socket.SendText('TEXT');
end;

procedure TForm1.Button6Click(Sender: TObject);
var len: integer;
begin
  SelFile.Execute;
  if FileExists(SelFile.filename) then
  begin
    F:=TFileStream.Create(SelFile.filename,fmOpenRead);
    try
        Cli.Socket.SendStream(F);
    except;
        F.Free;
    end;
  end;
end;

procedure TForm1.Button7Click(Sender: TObject);
var a,b,c: Char;
begin
  a:='a';
  b:='b';
  c:='c';
  showmessage(inttostr(ord(c) XOR ord(a)));

end;

procedure TForm1.Button8Click(Sender: TObject);
var i: integer;
label Skip;
begin
  for i:=1 to 65535 do
  begin
    try
      Serv.Port:=i;
      Serv.ServerType:=stNonblocking;
      Serv.Active:=true;
      Serv.Active:=false;
    except
      Serv.Active:=false;
      cmd.Lines.Add('&#207;&#238;&#240;&#242; '+inttostr(i)+' &#231;&#224;&#237;&#255;&#242;');
    end;
  end;
end;

procedure TForm1.CliDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  cmd.Lines.Add('Disconnect');
end;

procedure TForm1.CliError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  cmd.Lines.Add('Error');
  ErrorCode:=0
end;

procedure TForm1.CliRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  cmd.Lines.Add(Socket.ReceiveText);
end;

end.


...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727677
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты клиенту поток создать забыл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727679
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, как так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm1.ServGetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  cmd.Lines.Add('GetThread');
      SocketThread:=TServerThread.Create(true, ClientSocket);
      SocketThread.Priority:=tpNormal;
      SocketThread.FreeOnTerminate:=true;
      SocketThread.Resume;
end;


Есть же
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rusЕсть же

TClientSocketSet ClientType to ctNonBlocking to enable the client socket to respond to asynchronous
reading and writing events. When ClientType is ctNonBlocking, execution is not blocked by
reading and writing over the socket connection. OnRead or OnWrite events occur when the
socket needs to read or write over the connection.

When ClientType is ctBlocking, use a TWinSocketStream object for reading and
writing.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727695
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, офигеть. Спасибо за науку. А , собсно, где это делать? OnConnect клиента? А из чего? приму любые заумные ссылки по теме. За исключением отсылок к Socket API от живодёров
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727700
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, начитал . Буду пробовать. Если что подыму тему
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727707
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я правильно понимаю, что у TWinSocketStream я не смогу получить ReceiveLength и мне придётся с отправляющей стороны оканчивать отправляемую строку нулевым чаром, а на принимающей стороне разгребать весь буфер до нулевого чара? :(
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727722
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rusа на принимающей стороне разгребать весь буферЭто делать в любом случае придется. Никакой магии в ReceiveText не будет.
Будет 1-й раз "TEX", 2-й раз - "T".
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727723
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rus,

Indy позволяет получить строку целиком:

https://stackoverflow.com/questions/19371049/delphi-indy-readln-with-timeout
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727753
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon, про Indy не желаю ничего слышать по религиозным соображениям ;) прости
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727767
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rusпро Indy не желаю ничего слышать по религиозным соображениям

Но при этом используешь компоненты, которые по кривизне недалеко от него ушли. Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727772
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, я не говорю о безупречности scktcomp, а о том, что я не буду добавлять Id из-за одной функции
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39727798
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rus,

Тогда страдай :)
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39728214
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxY63rusмне придётся с отправляющей стороны оканчивать отправляемую строку нулевым чаром, а на принимающей стороне разгребать весь буфер до нулевого чара? :(Есть две модели пересылки данных по сокету

1. Каждое сообщение заканчивать неким терминатором
2. В начале каждого сообщения отправляется заголовочный пакет фиксированной длины, в котором указывается длина сообщения

Других вариантов для адекватной работы системы нет
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39734075
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не буду создавать тему, подниму эту.
Подскажите, если в потоке я буду работать с сокетами (в рантайме создавать ClientSocket) в неблокирующем режиме, это просто не прилично так делать или черевато какими-то ситуациями?
...
Рейтинг: 0 / 0
Работа с сокетами в блокирующем режиме
    #39734107
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не имеет смысла. Вся суть TClientSocket - лежать на форме в design-time. В любом
другом случае гораздо проще и удобнее пользоваться функциями winsock непосредственно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с сокетами в блокирующем режиме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]