Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с сокетами в блокирующем режиме / 20 сообщений из 20, страница 1 из 1
03.11.2018, 18:49
    #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
03.11.2018, 20:06
    #39727667
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
OxY63rusНо почему клиент не получает 'Привет'? Обработчик OnRead не срабатывает.

Поскольку кода клиента ты не показал, вангую, что он из сокета не читает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.11.2018, 20:18
    #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
03.11.2018, 20:20
    #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
03.11.2018, 20:24
    #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
03.11.2018, 20:37
    #39727677
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
Ты клиенту поток создать забыл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.11.2018, 20:44
    #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
03.11.2018, 21:10
    #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
03.11.2018, 21:20
    #39727695
OxY63rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
Dimitry Sibiryakov, офигеть. Спасибо за науку. А , собсно, где это делать? OnConnect клиента? А из чего? приму любые заумные ссылки по теме. За исключением отсылок к Socket API от живодёров
...
Рейтинг: 0 / 0
03.11.2018, 21:51
    #39727700
OxY63rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
Dimitry Sibiryakov, начитал . Буду пробовать. Если что подыму тему
...
Рейтинг: 0 / 0
03.11.2018, 23:23
    #39727707
OxY63rus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
Я правильно понимаю, что у TWinSocketStream я не смогу получить ReceiveLength и мне придётся с отправляющей стороны оканчивать отправляемую строку нулевым чаром, а на принимающей стороне разгребать весь буфер до нулевого чара? :(
...
Рейтинг: 0 / 0
04.11.2018, 01:11
    #39727722
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
OxY63rusа на принимающей стороне разгребать весь буферЭто делать в любом случае придется. Никакой магии в ReceiveText не будет.
Будет 1-й раз "TEX", 2-й раз - "T".
...
Рейтинг: 0 / 0
04.11.2018, 01:42
    #39727723
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с сокетами в блокирующем режиме
OxY63rus,

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

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

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

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

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

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


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